C++ Socket UDP范例

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

 

  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. }  

 

 

 

  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

C++,使用socket进行UDP(用户数据报协议)通信时,如果需要处理多个并发连接,通常会涉及到多线程技术。以下是创建一个多线程UDP服务器的基本步骤: 1. **包含头文件**: - `#include <iostream>` - `#include <boost/asio.hpp>` (C++17以后,也可以使用`<boost/asio/ip/udp.hpp>`) - `#include <thread>` 2. **设置异步套接字**: - 初始化Boost.Asio库的异步IO服务(如`std::shared_ptr<boost::asio::io_service> io_service = std::make_shared<boost::asio::io_service>();`) - 创建一个UDP套接字 (`boost::asio::ip::udp::endpoint endpoint`, 设置端口等) 3. **绑定和接受函数**: - 定义一个接收函数,通过`accept`操作监听并处理新的客户端连接(`void handle_new_connection(const boost::system::error_code& error, boost::asio::ip::udp::socket socket)`) 4. **创建多线程**: - 使用`std::thread`启动一个新的线程来处理每个新连接,将接受函数作为参数(`io_service->run();` 在主线程运行,其他线程通过`io_service->post(handle_new_connection)`异步调用). 5. **发送和接收数据**: - 在子线程的处理函数,读取客户端的数据,并根据需求进行响应。 6. **线程安全**: - 如果有共享资源或状态需要维护,记得使用互斥锁(如`std::mutex`)保证同步。 ```cpp // 示例代码片段 void handle_new_connection(const boost::system::error_code& error, boost::asio::ip::udp::socket socket) { if (!error) { // 在这里处理接收到的消息 boost::array<char, 256> buffer; boost::system::error_code ignored_error; size_t bytes_received = socket.receive(buffer, boost::asio::message_size(ignored_error), ignored_error); // 发送回复... } // 关闭连接 socket.close(); } int main() { // ...设定套接字... std::thread worker_thread(handle_new_connection, io_service); io_service.run(); // 运行主IO服务 // 等待所有连接关闭后退出 worker_thread.join(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值