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