网络通讯中出现10045的错误

时间:2023-01-24 11:41:59
int ret;
WSADATA wsaData;
eventTotal = 0;
InitializeCriticalSection(&cSection);
if((ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)
{
AfxMessageBox("´íÎó£ºWSAStartup failed with error %d\n", ret);
return 0;
}
SOCKET sListen;
SOCKADDR_IN inetAddr;
DWORD dwFlags;
DWORD dwRecvBytes;

if((sListen = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED))
== INVALID_SOCKET)
{
AfxMessageBox("´íÎó£ºcreate socket");
WSACleanup();
return 0;
}

inetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
inetAddr.sin_family = AF_INET;
inetAddr.sin_port = htons(SERVERPORT);
if(bind(sListen,(sockaddr *)&inetAddr,sizeof(inetAddr)) == SOCKET_ERROR)
{
AfxMessageBox("´íÎó£ºbind in start");
WSACleanup();
return 0;
}

if(listen(sListen,5) !=0 )
{
AfxMessageBox("´íÎó:listen failed in start");
return 0;
}

if((sAccept = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED))
== INVALID_SOCKET)
{
AfxMessageBox("´íÎó£ºcan not create sAccept Socket");
return 0;
}

if((eventArray[eventTotal] = WSACreateEvent()) == WSA_INVALID_EVENT)
{
AfxMessageBox("´íÎó£ºcan not create eventArray[0]");
return 0;
}
HANDLE handle;
DWORD dwThreadID;
if((handle = CreateThread(NULL,0,ProcessThreadIO,(LPVOID)this,0,&dwThreadID)) 
== NULL)
{
AfxMessageBox("´íÎó:can not create thread");
return 0;
}
CloseHandle(handle);
memset(&overlapped,0,sizeof(WSAOVERLAPPED));
overlapped.hEvent = eventArray[eventTotal];
eventTotal++;
dataBuf.buf = buffer;
dataBuf.len = DATA_BUFSIZE;

while(true)
{

int sockLen = sizeof(inetAddr);
if((sAccept = accept(sListen,(sockaddr*)&inetAddr,&sockLen))
== INVALID_SOCKET)
{
AfxMessageBox("²»ÄܽÓÊÕÁ¬½ÓÇëÇó");
return 0;
}

int error = 0;
if(WSARecv(sAccept,&dataBuf,1,&dwRecvBytes,&dwFlags,&overlapped,NULL)
== SOCKET_ERROR)

{
if ((error = WSAGetLastError()) != ERROR_IO_PENDING)
{
AfxMessageBox("·¢³ö½ÓÊÕÇëÇóʧ°Ü");
return 0;
}
}
}
return 1;

程序执行到if(WSARecv(sAccept,&dataBuf,1,&dwRecvBytes,&dwFlags,&overlapped,NULL)
== SOCKET_ERROR)出现了10045的错误,即:The attempted operation is not supported for the type of object referenced.
请问这个是什么原因?

4 个解决方案

#1


楼主要的是不是这个:http://www.chicagotech.net/troubleshooting/error10045.htm
大致是类型问题...

#2


我想知道的是为什么代码中会出现这个错误,我实在是查不出来。
我是用VC++写的一个很简单的DEMO,也参考过别人的程序,但是别人的程序
就不会出现这个错误,而上面的程序就会出现这个错误,我想知道原因。
谢谢你!

#3


sAccept   =   WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED)) 

跟你给的协议类型有关吧,IPPROTO_IP,一般来说,这里应该是IPPROTO_TCP.

#4


我现在把WSARecv改成recv就可以了。
我再试试把IPPROTO_IP改成IPPROTO_TCP行不行
谢谢大家的帮助

#1


楼主要的是不是这个:http://www.chicagotech.net/troubleshooting/error10045.htm
大致是类型问题...

#2


我想知道的是为什么代码中会出现这个错误,我实在是查不出来。
我是用VC++写的一个很简单的DEMO,也参考过别人的程序,但是别人的程序
就不会出现这个错误,而上面的程序就会出现这个错误,我想知道原因。
谢谢你!

#3


sAccept   =   WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED)) 

跟你给的协议类型有关吧,IPPROTO_IP,一般来说,这里应该是IPPROTO_TCP.

#4


我现在把WSARecv改成recv就可以了。
我再试试把IPPROTO_IP改成IPPROTO_TCP行不行
谢谢大家的帮助