C++ udp 通信

UDPclient.cpp

#include<WINSOCK2.H>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
WSADATA wsaData;//初始化
SOCKET SendSocket;
sockaddr_in RecvAddr;//服务器地址
int Port=4000;//服务器监听地址
char SendBuf[1024];//发送数据的缓冲区
int BufLen=1024;//缓冲区大小
//初始化Socket
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建Socket对象
SendSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//设置服务器地址
RecvAddr.sin_family=AF_INET;
RecvAddr.sin_port=htons(Port);
RecvAddr.sin_addr.s_addr=inet_addr("192.168.137.1");
//向服务器发送数据报
printf("Sending a datagram to the receiver...\n");
sendto(SendSocket,SendBuf,BufLen,0,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));
//发送完成,关闭Socket
printf("finished sending,close socket.\n");
closesocket(SendSocket);
printf("Exting.\n");
WSACleanup();
return 0;
}

 

UDPserver.cpp

#include<WINSOCK2.H>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
WSADATA wsaData;//初始化
SOCKET RecvSocket;
sockaddr_in RecvAddr;//服务器地址
int Port=4000;//服务器监听地址
char RecvBuf[1024];//发送数据的缓冲区
int BufLen=1024;//缓冲区大小
sockaddr_in SenderAddr;
int SenderAddrSize=sizeof(SenderAddr);
//初始化Socket
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建接收数据报的socket
RecvSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//将socket与制定端口和0.0.0.0绑定
RecvAddr.sin_family=AF_INET;
RecvAddr.sin_port=htons(Port);
RecvAddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(RecvSocket,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));
//调用Recvfrom函数在绑定的socket上接收数据
printf("receiving datagrams...\n");
recvfrom(RecvSocket,RecvBuf,BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
//关闭socket,结束接收数据
printf("finished receiving,closing socket..\n");
closesocket(RecvSocket);
//释放资源,退出
printf("Exiting.\n");
WSACleanup();
return 0;
}

转自https://www.cnblogs.com/lyggqm/p/6546925.html

 

在Ubuntu系统上使用C++进行UDP通信通常涉及以下几个步骤: 1. **包含头文件**: 首先,你需要在代码中包含`<iostream>`、`<string>`以及`<boost/asio.hpp>`,其中`boost`库是用于网络通信的常用库。 ```cpp #include <iostream> #include <string> #include <boost/asio.hpp> ``` 2. **设置异步IO上下文**: 使用`io_context`创建一个异步I/O服务,这是处理网络事件的基础。 ```cpp boost::asio::io_context io_context; ``` 3. **定义套接字**: 创建一个UDP套接字,使用`ip::udp::endpoint`指定远程主机和端口。 ```cpp boost::asio::ip::udp::socket socket(io_context); boost::asio::ip::udp::endpoint remote_endpoint("your.remote.ip", your.remote.port); ``` 4. **发送数据**: 使用`send_to()`函数发送UDP数据包到指定地址。 ```cpp std::string message = "Hello, UDP!"; auto send_future = socket.async_send_to( boost::asio::buffer(message), remote_endpoint, // 发送完成的回调 [&, result = std::move(send_future)](const boost::system::error_code& error, std::size_t bytes_transferred) { if (!error) std::cout << "Sent " << bytes_transferred << " bytes to " << remote_endpoint.address() << ":" << remote_endpoint.port() << std::endl; else std::cerr << "Error sending data: " << error.message() << std::endl; }); ``` 5. **接收数据**: 如果需要接收数据,可以设置一个接受事件监听器。 ```cpp // 接收缓冲区 std::array<char, 1024> receive_buffer; // 接收数据的回调 void on_receive(const boost::system::error_code& error, size_t bytes_transferred) { if (error == boost::asio::error::message_size_exceeded) std::cerr << "Message too large." << std::endl; else if (error) { std::cerr << "Error receiving data: " << error.message() << std::endl; } else { std::cout << "Received " << bytes_transferred << " bytes from " << remote_endpoint.address() << ":" << remote_endpoint.port() << ". Message: " << std::string(receive_buffer.data(), bytes_transferred) << std::endl; } } // 启动接收操作 socket.async_recv_from( boost::asio::buffer(receive_buffer), remote_endpoint, on_receive ); ``` 6. **启动异步IO循环**: 最后,启动异步I/O服务,使其开始处理网络事件。 ```cpp io_context.run(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值