C++ Windows Network Programming: 10 Sample Codes

This article provides 10 sample C++ codes for Windows network programming, covering basic concepts like establishing connections, sending and receiving data, and advanced features like multicast and asynchronous I/O.

1. Establishing a TCP Connection between a Client and Server:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message, server_reply[2000];
    int recv_size;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_addr.s_addr = inet_addr('127.0.0.1');
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
        cout<'connect error'<endl;
        return 1;
    }

    cout<'Connected'<endl;

    message = 'Hello Server!';
    if( send(s , message , strlen(message) , 0) < 0){
        cout<'Send failed'<endl;
        return 1;
    }

    cout<'Data Sent'<endl;

    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR){
        cout<'recv failed'<endl;
    }

    cout<'Reply received'<endl;

    server_reply[recv_size] = '\0';
    cout<<server_reply<<endl;

    closesocket(s);
    WSACleanup();

    return 0;
}

2. Creating a Server Socket and Listening for Incoming Connections:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    char *message, client_reply[2000];
    int c, recv_size;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    listen(s , 3);

    cout<'Waiting for incoming connections...'<endl;

    c = sizeof(struct sockaddr_in);
    new_socket = accept(s , (struct sockaddr *)&client, &c);
    if (new_socket == INVALID_SOCKET){
        cout<'accept failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Connection accepted'<endl;

    if((recv_size = recv(new_socket , client_reply , 2000 , 0)) == SOCKET_ERROR){
        cout<'recv failed'<endl;
    }

    cout<'Reply received'<endl;

    client_reply[recv_size] = '\0';
    cout<<client_reply<<endl;

    message = 'Hello Client!';
    send(new_socket , message , strlen(message) , 0);

    cout<'Data Sent'<endl;

    closesocket(s);
    WSACleanup();

    return 0;
}

3. Creating a UDP Socket and Sending Data to a Server:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server, si_other;
    char *message = 'Hello Server!';
    char server_reply[2000];
    int recv_size, slen = sizeof(si_other);

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP)) == SOCKET_ERROR){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    si_other.sin_family = AF_INET;
    si_other.sin_port = htons(8888);
    si_other.sin_addr.s_addr = inet_addr('127.0.0.1');

    if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR){
        cout<'sendto() failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Data Sent'<endl;

    closesocket(s);
    WSACleanup();

    return 0;
}

4. Receiving Data on a Server from a UDP Client:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server, si_other;
    char *message = 'Hello Client!';
    char client_reply[2000];
    int recv_size, slen = sizeof(si_other);

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP)) == SOCKET_ERROR){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    while(1){
        cout<'Waiting for data...'<endl;
        fflush(stdout);

        if ((recv_size = recvfrom(s, client_reply, 2000, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR){
            cout<'recvfrom() failed with error code : '<WSAGetLastError() << endl;
        }

        cout<'Data received from '<inet_ntoa(si_other.sin_addr) << ':' << ntohs(si_other.sin_port) << endl;

        client_reply[recv_size] = '\0';
        cout<<client_reply<<endl;

        if (sendto(s, message, strlen(message) , 0 , (struct sockaddr*) &si_other, slen) == SOCKET_ERROR){
            cout<'sendto() failed with error code : '<WSAGetLastError() << endl;
            return 1;
        }

        cout<'Data Sent'<endl;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

5. Creating a Non-Blocking Socket:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message, server_reply[2000];
    int recv_size;
    u_long iMode = 1;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_addr.s_addr = inet_addr('127.0.0.1');
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
        cout<'connect error'<endl;
        return 1;
    }

    cout<'Connected'<endl;

    message = 'Hello Server!';
    if( send(s , message , strlen(message) , 0) < 0){
        cout<'Send failed'<endl;
        return 1;
    }

    cout<'Data Sent'<endl;

    // Set the socket to non-blocking mode
    iMode = 1;
    ioctlsocket(s, FIONBIO, &iMode);

    while (1){
        recv_size = recv(s, server_reply, 2000, 0);
        if (recv_size > 0){
            server_reply[recv_size] = '\0';
            cout<<server_reply<<endl;
            break;
        }
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

6. Creating a Thread to Handle Incoming Connections on a Server:

#include<iostream>
#include<winsock2.h>
#include<process.h>
using namespace std;

void handler(void *);

int main(){
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    char *message, client_reply[2000];
    int c, recv_size;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    listen(s , 3);

    cout<'Waiting for incoming connections...'<endl;

    c = sizeof(struct sockaddr_in);

    while ((new_socket = accept(s , (struct sockaddr *)&client, &c))){
        cout<'Connection accepted'<endl;

        // create a new thread to handle the incoming connection
        _beginthread(handler, 0, (void *) &new_socket);
    }

    if (new_socket == INVALID_SOCKET){
        cout<'accept failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

void handler(void *socket_desc){
    SOCKET sock = *(SOCKET*)socket_desc;
    char *message, client_reply[2000];
    int recv_size;

    message = 'Hello Client!';
    send(sock , message , strlen(message) , 0);

    cout<'Data Sent'<endl;

    if((recv_size = recv(sock , client_reply , 2000 , 0)) == SOCKET_ERROR){
        cout<'recv failed'<endl;
    }

    cout<'Reply received'<endl;

    client_reply[recv_size] = '\0';
    cout<<client_reply<<endl;

    closesocket(sock);
    _endthread();
}

7. Sending Data to Multiple Clients on a Server:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    char *message = 'Hello Client!';
    int c;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    listen(s , 3);

    cout<'Waiting for incoming connections...'<endl;

    c = sizeof(struct sockaddr_in);

    while ((new_socket = accept(s , (struct sockaddr *)&client, &c))){
        cout<'Connection accepted'<endl;

        // send data to the client
        send(new_socket , message , strlen(message) , 0);
    }

    if (new_socket == INVALID_SOCKET){
        cout<'accept failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

8. Creating a UDP Multicast Socket:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server, multicast;
    char *message = 'Hello Multicast!';
    char server_reply[2000];
    int recv_size, slen = sizeof(multicast);

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP)) == SOCKET_ERROR){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    multicast.sin_family = AF_INET;
    multicast.sin_addr.s_addr = inet_addr('239.255.255.250');
    multicast.sin_port = htons( 1900 );

    if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&s, sizeof(s)) < 0){
        cout<'setsockopt() failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &multicast, slen) == SOCKET_ERROR){
        cout<'sendto() failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Data Sent'<endl;

    closesocket(s);
    WSACleanup();

    return 0;
}

9. Receiving Data on a UDP Multicast Socket:

#include<iostream>
#include<winsock2.h>
using namespace std;

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server, multicast;
    char *message = 'Hello Multicast!';
    char server_reply[2000];
    int recv_size, slen = sizeof(multicast);

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP)) == SOCKET_ERROR){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
        cout<'Bind failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Bind done'<endl;

    multicast.sin_family = AF_INET;
    multicast.sin_addr.s_addr = inet_addr('239.255.255.250');
    multicast.sin_port = htons( 1900 );

    if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&multicast, sizeof(multicast)) < 0){
        cout<'setsockopt() failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    while (1){
        cout<'Waiting for data...'<endl;
        fflush(stdout);

        if ((recv_size = recvfrom(s, server_reply, 2000, 0, (struct sockaddr *) &multicast, &slen)) == SOCKET_ERROR){
            cout<'recvfrom() failed with error code : '<WSAGetLastError() << endl;
        }

        cout<'Data received from '<inet_ntoa(multicast.sin_addr) << ':' << ntohs(multicast.sin_port) << endl;

        server_reply[recv_size] = '\0';
        cout<<server_reply<<endl;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

10. Sending and Receiving Data on a TCP Connection using Asynchronous I/O:

#include<iostream>
#include<winsock2.h>
using namespace std;

#define MAX_BUFFER_SIZE 1024

int main(){
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    WSAEVENT hEvent;
    WSABUF wsaBuf;
    char buffer[MAX_BUFFER_SIZE], server_reply[MAX_BUFFER_SIZE];
    DWORD dwBytes, dwFlags = 0;
    int recv_size;

    cout<'Initialising Winsock...'<endl;
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        cout<'Failed. Error Code : '<WSAGetLastError() << endl;
        return 1;
    }

    cout<'Initialised.'<<endl;

    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
        cout<'Could not create socket : '<WSAGetLastError() << endl;
    }

    cout<'Socket created.'<<endl;

    server.sin_addr.s_addr = inet_addr('127.0.0.1');
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
        cout<'connect error'<endl;
        return 1;
    }

    cout<'Connected'<endl;

    // Create an event object
    hEvent = WSACreateEvent();
    if (hEvent == WSA_INVALID_EVENT){
        cout<'WSACreateEvent failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    // Prepare the WSABUF structure
    wsaBuf.buf = buffer;
    wsaBuf.len = MAX_BUFFER_SIZE;

    // Send data asynchronously
    dwFlags = 0;
    if (WSASend(s, &wsaBuf, 1, &dwBytes, dwFlags, hEvent, NULL) == SOCKET_ERROR){
        cout<'WSASend failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    // Wait for the send operation to complete
    if (WSAWaitForMultipleEvents(1, &hEvent, FALSE, INFINITE, FALSE) == WSA_WAIT_FAILED){
        cout<'WSAWaitForMultipleEvents failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    // Receive data asynchronously
    dwFlags = 0;
    if (WSARecv(s, &wsaBuf, 1, &dwBytes, &dwFlags, hEvent, NULL) == SOCKET_ERROR){
        cout<'WSARecv failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    // Wait for the receive operation to complete
    if (WSAWaitForMultipleEvents(1, &hEvent, FALSE, INFINITE, FALSE) == WSA_WAIT_FAILED){
        cout<'WSAWaitForMultipleEvents failed with error code : '<WSAGetLastError() << endl;
        return 1;
    }

    // Process the received data
    server_reply[dwBytes] = '\0';
    cout<<server_reply<<endl;

    closesocket(s);
    WSACleanup();

    return 0;
}

These are just basic examples, and there are many other aspects of Windows network programming that you can explore, such as:

  • Advanced socket options: Setting timeouts, buffer sizes, and other parameters.
  • Multithreading: Using threads to handle multiple connections simultaneously.
  • Security: Implementing security measures like encryption and authentication.
  • Error handling: Implementing robust error handling mechanisms.

By exploring these advanced topics and experimenting with different code scenarios, you can build powerful and sophisticated network applications using C++ on Windows.

C++ Windows Network Programming: 10 Sample Codes

原文地址: https://www.cveoy.top/t/topic/lDHD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录