1. 程式人生 > >WSASendTo()與WSARecvfrom()函式傳送wsabuf結構體陣列

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