C++ send and receive messages with winsock2

Hello, I want to send a message with my c++ windows program to different computer. I found winsock2 and tried to use it.


Example Code provided by microsoft:

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
125
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")


#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int __cdecl main(int argc, char **argv) 
{
    WSADATA wsaData;
    SOCKET ConnectSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    const char *sendbuf = "this is a test";
    char recvbuf[DEFAULT_BUFLEN];
    int iResult;
    int recvbuflen = DEFAULT_BUFLEN;
    
    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s server-name\n", argv[0]);
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        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], DEFAULT_PORT, &hints, &result);
    if ( iResult != 0 ) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        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: %ld\n", WSAGetLastError());
            WSACleanup();
            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();
        return 1;
    }

    // Send an initial buffer
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf("send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %ld\n", iResult);

    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed with error: %d\n", WSAGetLastError());

    } while( iResult > 0 );

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

    return 0;
}


I run the program trough command line.

thanks for any idea


-----------------------------------
UPDATE: I should use double qoutes ("") for args when running.
UPDATE 2: ANTIVIRUS BLOCKING PORTS. (for ESET use rules manager select your program from local tab and release all communication)
UPDATE 3: You can make .bat file. Again both ip and parameters should use double qoutes. Additionally, you should use PAUSE expression after command in order to make server listen without termination.

FOR NOW MY ISSUE LOOKS LIKE FIXED
Last edited on
The two computers you have in mind, where are they? Are they both in a typical home with home router (and using NAT)?

Your primary problem isn't a programming one, it's a network routing one, I believe.
I added the code provided by microsoft (winsock2) indeed I tried to use it alone in seperate program I added nedded libs.
( please check lines in code: "// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib")

However, I can not connect anywhere.

That should be on command line as: C:\.......programpath\>program.exe "127.0.0.1"

or any server name.

then the result is always "can not connect server"

what am I missing ???

Note that I am at home about two weeks due to coronavirus my mind is maybe melted.
Last edited on
You haven't answered my question. Depending on where the computers are, you may not be able to connect at all. So it's kinda important.

As for your code, it's a TCP client that connects to a named server on port 27015 and sends "this is a test", reads the reply and terminates. You need to provide the server side for communication to work.
Sorry, they are on same router. Same OS. Whatever, I forgot to run the server code and I believed I will send anything to the space. I am stupid. Confirmed.

So in the end I pinged myself. Running the server and waiting. Then running the client program with arg "localhost" or "127.0.0.1" then done. Somehow I have to use double qoutes for args.

Here is the image: https://ibb.co/283qvW9
(wnsckSvrProj is the server)

To test it trough routers I have to go out. I will not do that until disease ends.
Last edited on
Alright I tested it on same router but with different local IP's (different windows computers) example laptop "1xx.xxx.x.13." mine is desktop "10". So I ran in to the other room immediately and looked into the console and ow yesss. I seen that bytes received. The reason was antivirus program again. I released "27015" for my application. Both client program and server program should be free of scan but for one way communication only one will be enough.
Last edited on
The screenshoot looks good, both sides seem to be talking to each other. Sounds like problem solved.

If you send the program to a friend, who runs it at home, your program won't work, that's because the client won't be able to see the server, unless the home router in front of it is setup to redirect traffic from port 27015 to the computer that's running the server app.
Yes correct, still I can send bytes to dynamic IPs rather than 192.168... right ?
(if I open/reserve ports and manage firewall)
Last edited on
Yes.
Registered users can post here. Sign in or register to post.