天天看點

WSASendTo WSARecvFrom在msdn上的代碼的錯誤

這個錯誤讓我深深的迷惑了好長時間 我們看一下源代碼

#include <stdio.h>
#include "winsock2.h"

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 SendBuf[1024] = "Data buffer to send";
  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("123.123.123.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(ip);
  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 = SendBuf;
  WSASendTo(SendSocket, 
    &DataBuf, 
    1,
    &BytesSent,
    Flags,
    (SOCKADDR*) &RecvAddr,
    RecvAddrSize,
    &Overlapped,
    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;
}
      
這是微軟的源代碼 我直接粘貼編譯 傳回永遠是socketerror并且getlasterror之後,永遠都是6(句柄無效)      
需要對      
Overlapped.m_hevent進行指派,然而預設值是無效的      
Overlapped.m_hevent = CreateEvent(NULL,TRUE,FALSE,NULL) ;      
使之變成有效值      

繼續閱讀