WSASendTo()与WSARecvfrom()函数发送wsabuf结构体数组

发送端:
void main() {
 
 //---------------------------------------------
 // Declare and initialize variables
 WSADATA wsaData;
 WSABUF DataBuf[2];
 WSAOVERLAPPED Overlapped;
 SOCKET SendSocket;
 sockaddr_in RecvAddr;
 sockaddr_in LocalAddr;
 int RecvAddrSize = sizeof(RecvAddr);
 int LocalAddrSize = sizeof(LocalAddr);
 int Port = 27015;
 char *ip;
 char SendBuf1[1024] = "Data buffer to send1";
 char SendBuf2[1024] = "Data buffer to send2";
 int BufLen = 1024;
 DWORD BytesSent = 0, Flags = 0;
 
 //---------------------------------------------
 // Initialize Winsock
 WSAStartup(MAKEWORD(2,2), &wsaData);
 
 //---------------------------------------------
 // Create a socket for sending data
 SendSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0,

WSA_FLAG_OVERLAPPED);
 
 //---------------------------------------------
 // Set up the RecvAddr structure with the IP address of
 // the receiver (in this example case "123.123.123.1")
 // and the specified port number.
 RecvAddr.sin_family = AF_INET;
 RecvAddr.sin_port = htons(Port);
 RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
 //---------------------------------------------
 // Set up the LocalAddr structure with the local IP address
 // and the specified port number.
 hostent* localHost;
 localHost = gethostbyname("");
 ip = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list);
 
 LocalAddr.sin_family = AF_INET;
 LocalAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 LocalAddr.sin_port = htons(Port);
 
 //---------------------------------------------
 // Bind the sending socket to the LocalAddr structure
 // that has the internet address family, local IP address
 // and specified port number. 
 bind(SendSocket, (sockaddr*) &LocalAddr, LocalAddrSize);
 
 //---------------------------------------------
 // Send a datagram to the receiver
 printf("Sending a datagram...\n");
 DataBuf[0].len = BufLen;
 DataBuf[0].buf = SendBuf1;
 DataBuf[1].len = BufLen;
 DataBuf[1].buf = SendBuf2;
 WSASendTo(SendSocket,
  DataBuf,
  2,
  &BytesSent,
  Flags,
  (SOCKADDR*) &RecvAddr,
  RecvAddrSize,
  NULL,
  NULL);
 
 //---------------------------------------------
 // When the application is finished sending, close the socket.
 printf("Finished sending. Closing socket.\n");
 closesocket(SendSocket);
 printf("Exiting.\n");
 
 //---------------------------------------------
 // Clean up and quit.
 WSACleanup();
 return;
}

接收端:
void main() {
 
 WSADATA wsaData;
 WSABUF DataBuf[2];
 WSAOVERLAPPED Overlapped;
 SOCKET RecvSocket;
 sockaddr_in RecvAddr;
 sockaddr_in SenderAddr;
 int SenderAddrSize = sizeof(SenderAddr);
 int Port = 27015;
 char RecvBuf1[1024];
 int  BufLen1 = 1024;
 char RecvBuf2[1024];
 int  BufLen2 = 1024;
 DWORD BytesRecv = 0, Flags = 0, BytesTransferred = 0;
 
 //-----------------------------------------------
 // Initialize Winsock
 WSAStartup(MAKEWORD(2,2), &wsaData);
 
 //-----------------------------------------------
 // Create a receiver socket to receive datagrams
 RecvSocket = WSASocket(AF_INET,
  SOCK_DGRAM,
  IPPROTO_UDP,
  NULL,
  0,
  WSA_FLAG_OVERLAPPED);
 
 //-----------------------------------------------
 // Bind the socket to any address and the specified port.
 RecvAddr.sin_family = AF_INET;
 RecvAddr.sin_port = htons(Port);
 RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 
 bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
 
 
 //-----------------------------------------------
 // Call the recvfrom function to receive datagrams
 // on the bound socket.
 DataBuf[0].len = BufLen1;
 DataBuf[0].buf = RecvBuf1;
 DataBuf[1].len = BufLen2;
 DataBuf[1].buf = RecvBuf2;
 printf("Listening for incoming datagrams...\n");
 WSARecvFrom(RecvSocket,
  DataBuf,
  2,
  &BytesRecv,
  &Flags,
  (SOCKADDR *) &SenderAddr,
  &SenderAddrSize,
  NULL,
  NULL);
 
 //---------------------------------------------
 // When the application is finished receiving, close the socket.
 printf("Finished receiving. Closing socket.\n");
 closesocket(RecvSocket);
 printf("Exiting.\n");
 
 //---------------------------------------------
 // Clean up and quit.
 WSACleanup();
 return;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WSASendTo()函数是Windows Sockets API中用于发送数据报的函数。它的基本语法如下: ``` int WSASendTo( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, const struct sockaddr *lpTo, int iToLen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); ``` 参数说明如下: - `s`:指定一个已经连接或未连接的套接字。 - `lpBuffers`:指向一个或多个要发送的数据缓冲区的指针。 - `dwBufferCount`:指定要发送的数据缓冲区的数量。 - `lpNumberOfBytesSent`:返回实际发送的字节数。 - `dwFlags`:指定调用的行为选项。 - `lpTo`:指向目标地址的指针。 - `iToLen`:指定目标地址结构体的大小。 - `lpOverlapped`:指向一个WSAOVERLAPPED结构的指针,用于异步操作。 - `lpCompletionRoutine`:指向一个称为完成例程的回调函数的指针,用于异步操作。 下面是一个简单的示例,展示如何使用WSASendTo()函数发送数据报: ```c++ SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == INVALID_SOCKET) { // 处理错误情况 } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(1234); inet_pton(AF_INET, "192.168.1.100", &serverAddr.sin_addr); char buffer[] = "Hello, world!"; WSABUF dataBuf; dataBuf.len = strlen(buffer) + 1; dataBuf.buf = buffer; DWORD bytesSent = 0; int result = WSASendTo(sock, &dataBuf, 1, &bytesSent, 0, (sockaddr*)&serverAddr, sizeof(serverAddr), NULL, NULL); if (result == SOCKET_ERROR) { // 处理错误情况 } // 关闭套接字 closesocket(sock); ``` 在这个示例中,我们首先创建一个SOCK_DGRAM类型的UDP套接字。然后,我们设置服务器地址和端口,并填充一个数据缓冲区。最后,我们调用WSASendTo()函数发送数据报。如果函数成功返回,它将返回实际发送的字节数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值