这个错误让我深深的迷惑了好长时间
我们看一下源代码
#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) ;使之变成有效值