完成端口投递WSARecv时返回10014,求助.(急!!)
只贴主要的代码:
初始化:
WSAStartup........
.......
myport=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
thread=CreateThread(NULL,0,RecvData,myport,0,NULL);
CloseHandle(thread);
AfxBeginThread(AcceptClient,NULL);
监听:
UINT AcceptClient(LPVOID pParam)
{
int nret;
int port=8886;
int clientsize=sizeof(CCompletionPortServerDlg::clientaddress);
DWORD recvdata,flag;
lpdata d;
CCompletionPortServerDlg::server=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
CCompletionPortServerDlg::serveraddress.sin_family=AF_INET;
CCompletionPortServerDlg::serveraddress.sin_addr.s_addr=htonl(INADDR_ANY);
CCompletionPortServerDlg::serveraddress.sin_port=htons(port);
nret=bind(CCompletionPortServerDlg::server,(SOCKADDR*)&CCompletionPortServerDlg::serveraddress,sizeof(CCompletionPortServerDlg::serveraddress));
nret=listen(CCompletionPortServerDlg::server,5);
while( TRUE )
{
if( Over )
break;
CCompletionPortServerDlg::client=WSAAccept( CCompletionPortServerDlg::server,(SOCKADDR*)&CCompletionPortServerDlg::clientaddress,&clientsize,NULL,0 );
lpclientdata data=NULL;
data=(lpclientdata)GlobalAlloc(GPTR,sizeof(clientdata));
data->s=CCompletionPortServerDlg::client;
memcpy(&data->addr,&CCompletionPortServerDlg::clientaddress,clientsize);
CreateIoCompletionPort( (HANDLE)CCompletionPortServerDlg::client,CCompletionPortServerDlg::myport,(DWORD)data,0 );
flag=0;
WSARecv( data->s,&(d->DataBuf),1,&recvdata,&flag,&(d->Overlapped),NULL );
CString j;
j.Format("%d",WSAGetLastError());
AfxMessageBox(j);//这里显示错误10014
}
return 1;
}
工作者线程:
DWORD WINAPI RecvData(LPVOID myport)
{
HWND edit=GetDlgItem(CCompletionPortServerDlg::hwnd,IDC_MESSAGE);
HANDLE theport=(HANDLE)myport;
lpdata recvdata;
lpclientdata clientinfo;
DWORD recv_data,flags,ret;
while( TRUE )
{
ret=GetQueuedCompletionStatus( theport,&recv_data,(LPDWORD)&clientinfo,(LPOVERLAPPED*)&recvdata,INFINITE );
if( recv_data == 0 && (recvdata->OperationType == RECV_POSTED || recvdata->OperationType == SEND_POSTED) )
{
closesocket(clientinfo->s);
GlobalFree(recvdata);
GlobalFree(clientinfo);
continue;
}
if( recvdata->OperationType == RECV_POSTED )
{
AfxMessageBox(recvdata->Buffer);
::SetWindowText(edit,recvdata->Buffer);
}
flags=0;
memset(&(recvdata->Overlapped),0,sizeof(OVERLAPPED));
recvdata->DataBuf.len=DATA_BUFSIZE;
recvdata->DataBuf.buf=recvdata->Buffer;
recvdata->OperationType=RECV_POSTED;
WSARecv(clientinfo->s,&(recvdata->DataBuf),1,&recv_data,&flags,&(recvdata->Overlapped),NULL);
}
return 1;
}
客户端连接上以后服务器端可以发数据到客户端,不过客户端发的服务器端收不到,服务器停在GetQueuedCompletionStatus那里。