winsock2 program crashes

Hello everyone!
I have made a simple c++ client program using winsock2. It is able to connect to a server and send/recieve data. It currently works like this:

*You connect to a server using 2 parameters (IP, Port)
*You then type a message to the server
*Then the program starts to receiving data from the server until you or the server closes the connection.

But I want to upgrade it so you always can send data not only 1 message.
I think I know how but the problem is that I need to be able to access the socket object from another function. When I declare the socket object outside of the main function the program crashes when it is about to send data. It seems like it connects to the server successfully but for some reason it crashes.

Here is the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x501
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

#define DEFAULT_BUFLEN 512

using namespace std;

SOCKET ConnectSocket = INVALID_SOCKET;

int __cdecl main(int argc, char **argv)
{
    WSADATA wsaData;
    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;

    char *sendbuf;
    char recvbuf[DEFAULT_BUFLEN];
    int iResult;
    int recvbuflen = DEFAULT_BUFLEN;
    int recvResult;

    // Validate the parameters
    if (argc != 3) {
        printf("Usage: %s server-name port\n", argv[0]);
        system("pause");
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        system("pause");
        return 1;
    }

    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], argv[2], &hints, &result);
    if ( iResult != 0 ) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        system("pause");
        return 1;
    }

    // Attempt to connect to an address until one succeeds
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

        // Create a SOCKET for connecting to server
        ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
            ptr->ai_protocol);
        if (ConnectSocket == INVALID_SOCKET) {
            printf("socket failed with error: %d\n", WSAGetLastError());
            WSACleanup();
            system("pause");
            return 1;
        }

        // Connect to server.
        iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
        if (iResult == SOCKET_ERROR) {
            closesocket(ConnectSocket);
            ConnectSocket = INVALID_SOCKET;
            continue;
        }
        break;
    }

    freeaddrinfo(result);

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Unable to connect to server!\n");
        WSACleanup();
        system("pause");
        return 1;
    }

    printf("Type your message: ");
    gets(sendbuf);
    int trySend;
    trySend = send(ConnectSocket, sendbuf, (int) strlen(sendbuf), 0);

    if (trySend == SOCKET_ERROR) {
        printf("Send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        system("pause");
        return 1;
    }

    // Receive until the peer closes the connection
    do {


        recvResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if (recvResult > 0) {
            printf("Received: %s\n", recvbuf);
        } else {
            printf("Connection Closed\n");
            break;
        }


    } while(recvResult > 0);

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();

    system("pause");

}


Last edited on
The problem is sendbuf: It's an uninitialized pointer. You need to provide a real buffer like recvbuf not just a pointer.
Thanks man! Works great!
Topic archived. No new replies allowed.