C++ Windows Network Programming: 10 Sample Codes
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.
原文地址: https://www.cveoy.top/t/topic/lDHD 著作权归作者所有。请勿转载和采集!