井底燕雀傥 发表于 2024-3-2 09:51:15

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

发送端:
void main() {

//---------------------------------------------
// Declare and initialize variables
WSADATA wsaData;
WSABUF DataBuf;
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 = "Data buffer to send1";
char SendBuf2 = "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.len = BufLen;
DataBuf.buf = SendBuf1;
DataBuf.len = BufLen;
DataBuf.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;
WSAOVERLAPPED Overlapped;
SOCKET RecvSocket;
sockaddr_in RecvAddr;
sockaddr_in SenderAddr;
int SenderAddrSize = sizeof(SenderAddr);
int Port = 27015;
char RecvBuf1;
intBufLen1 = 1024;
char RecvBuf2;
intBufLen2 = 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.len = BufLen1;
DataBuf.buf = RecvBuf1;
DataBuf.len = BufLen2;
DataBuf.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;
}
页: [1]
查看完整版本: WSASendTo()与WSARecvfrom()函数发送wsabuf结构体数组