C++ Socket UDP "Hello World!"

这是C++ SOCKET网络程序中的C/S结构之UDP "Hello World !",共两个控制台工程:

[cpp] view plain copy
 
 print?
  1. //////////////////////////////////////////////////////////////////////////  
  2. // UDPServer.cpp  
  3.   
  4. #include <stdio.h>  
  5. #include <WINSOCK2.H>  
  6.   
  7. #pragma comment(lib,"WS2_32.lib")  
  8. #define BUF_SIZE    64  
  9.   
  10. int main(void)  
  11. {  
  12.     WSADATA wsd;  
  13.     SOCKET  s;  
  14.     int     nRet;  
  15.   
  16.     // 初始化套接字动态库  
  17.     if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)  
  18.     {  
  19.         printf("WSAStartup failed !/n");  
  20.         return 1;  
  21.     }  
  22.   
  23.     // 创建套接字  
  24.     s = socket(AF_INET,SOCK_DGRAM,0);  
  25.     if(s == INVALID_SOCKET)  
  26.     {  
  27.         printf("socket() failed ,Error Code:%d/n",WSAGetLastError());  
  28.         WSACleanup();  
  29.         return 1;  
  30.     }  
  31.   
  32.     SOCKET      socketSrv = socket(AF_INET,SOCK_DGRAM,0);  
  33.     SOCKADDR_IN addrSrv;  
  34.     SOCKADDR_IN addrClient;  
  35.     char        buf[BUF_SIZE];  
  36.     int         len = sizeof(SOCKADDR);  
  37.   
  38.     // 设置服务器地址  
  39.     ZeroMemory(buf,BUF_SIZE);  
  40.     addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  41.     addrSrv.sin_family = AF_INET;  
  42.     addrSrv.sin_port = htons(5000);  
  43.   
  44.     // 绑定套接字  
  45.     nRet = bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
  46.     if(SOCKET_ERROR == nRet)     
  47.     {     
  48.         printf("bind failed !/n");     
  49.         closesocket(s);     
  50.         WSACleanup();     
  51.         return -1;     
  52.     }  
  53.   
  54.     // 从客户端接收数据  
  55.     nRet = recvfrom(socketSrv,buf,BUF_SIZE,0,(SOCKADDR*)&addrClient,&len);  
  56.     if(SOCKET_ERROR == nRet)     
  57.     {     
  58.         printf("recvfrom failed !/n");     
  59.         closesocket(s);     
  60.         WSACleanup();     
  61.         return -1;     
  62.     }  
  63.     // 打印来自客户端发送来的数据  
  64.     printf("Recv From Client:%s/n",buf);  
  65.   
  66.     // 向客户端发送数据  
  67.     sendto(socketSrv,"UDP Hello World !",sizeof("UDP Hello World !"),0,(SOCKADDR*)&addrClient,len);  
  68.     closesocket(s);  
  69.     WSACleanup();  
  70.     return 0;  
  71. }  
[cpp] view plain copy
 
 print?
  1. //////////////////////////////////////////////////////////////////////////  
  2. // UDPClient.cpp  
  3.   
  4. #include <stdio.h>  
  5. #include <WINSOCK2.H>  
  6.   
  7. #pragma comment(lib,"WS2_32.lib")  
  8. #define BUF_SIZE    64  
  9.   
  10. int main(void)  
  11. {  
  12.     WSADATA wsd;      
  13.     SOCKET  s;  
  14.   
  15.     // 初始化套接字动态库  
  16.     if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)  
  17.     {  
  18.         printf("WSAStartup failed !/n");  
  19.         return 1;  
  20.     }  
  21.   
  22.     // 创建套接字  
  23.     s = socket(AF_INET,SOCK_DGRAM,0);  
  24.     if(s == INVALID_SOCKET)  
  25.     {  
  26.         printf("socket() failed, Error Code:%d/n",WSAGetLastError());  
  27.         WSACleanup();  
  28.         return 1;  
  29.     }  
  30.   
  31.     char        buf[BUF_SIZE];  // 接受数据  
  32.     SOCKADDR_IN servAddr;       // 服务器套接字地址  
  33.     SOCKET      sockClient = socket(AF_INET,SOCK_DGRAM,0);  
  34.     int         nRet;  
  35.   
  36.     ZeroMemory(buf,BUF_SIZE);  
  37.     strcpy(buf,"UDP Hello World !");  
  38.   
  39.     // 设置服务器地址  
  40.     servAddr.sin_family = AF_INET;  
  41.     servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.254");  
  42.     servAddr.sin_port = htons(5000);  
  43.   
  44.     // 向服务器发送数据  
  45.     int nServAddLen = sizeof(servAddr);  
  46.     if(sendto(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,nServAddLen) == SOCKET_ERROR)  
  47.     {  
  48.         printf("recvfrom() failed:%d/n",WSAGetLastError());  
  49.         closesocket(s);  
  50.         WSACleanup();  
  51.         return 1;  
  52.     }  
  53.     nRet = recvfrom(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,&nServAddLen);  
  54.     if(SOCKET_ERROR == nRet)     
  55.     {     
  56.         printf("recvfrom failed !/n");     
  57.         closesocket(s);     
  58.         WSACleanup();     
  59.         return -1;     
  60.     }  
  61.   
  62.     // 打印来自服务端发送来的数据  
  63.     printf("Recv From Server:%s/n",buf);  
  64.     closesocket(s);  
  65.     WSACleanup();  
  66.     return 0;  
  67. }  

程序运行效果:

UDP Hello World!

源代码下载地址:

http://www.rayfile.com/files/733c832e-a2d8-11de-a838-0014221b798a/

http://blog.csdn.net/wangningyu/article/details/4560835

原文地址:https://www.cnblogs.com/findumars/p/5928712.html