這個錯誤讓我深深的迷惑了好長時間 我們看一下源代碼
#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) ;
使之變成有效值