我一直试图解决这个问题一段时间,我需要帮助,因为我没有想法。我的WSAEventselect函数返回错误号10038。
代码:
// Error checking....
if(netEvent.iErrorCode[FD_ACCEPT_BIT] != 0)
{
int temp1 = WSAGetLastError();
emit ClientErrorSignal();
return;
}
// Initializing socket
if((newClient = accept(this->info->socket, NULL, NULL)) == INVALID_SOCKET)
{
int temp2 = WSAGetLastError();
emit ClientErrorSignal();
return;
}
// This is where the error occurs
if(WSAEventSelect(newClient, &this->info->event, FD_READ|FD_CLOSE) == SOCKET_ERROR)
{
int temp3 = WSAGetLastError();
emit ClientErrorSignal();
return;
}
this->info
是传递给线程的结构。
typedef struct {
SOCKET socket;
int size;
bool isTcp;
WSAEVENT event;
} SINFO, *PSINFO;
答案 0 :(得分:2)
根据the Winsock error reference,这是WSAENOTSOCK
错误,这意味着您正在尝试使用无效的套接字句柄执行某些操作。如果没有关于代码中错误发生位置的更多信息,我认为我不能提供比这更多的建议,但我建议检查以确保正确创建套接字(可能是对{{1的调用)在未初始化的套接字上是罪魁祸首?)
答案 1 :(得分:1)
这可能与您的问题有关,也可能没有,但您传递给WSAEventSelect
的第二个参数是WSAEVENT*
,而该函数需要WSAEVENT
。只需直接传递句柄,而不是其地址:
WSAEventSelect(..., info->event, ...);