完成端口投递WSARecv时返回10014,求助.(急!!)

umbrella1984 2005-10-11 05:01:20
只贴主要的代码:

初始化:
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那里。
...全文
618 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifengice0706 2005-10-12
  • 打赏
  • 举报
回复
你按我说的改了还不行吗?
umbrella1984 2005-10-11
  • 打赏
  • 举报
回复
楼上的,拜托!
周江涛 2005-10-11
  • 打赏
  • 举报
回复
这种错误容易找,
lifengice0706 2005-10-11
  • 打赏
  • 举报
回复
我编译了你的代码,做了以下改动,现在AcceptClient()中的wsarecv()好了,至于recvdata()中的我没看。
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
char Buffer[DATA_BUFSIZE];
int OperationType;
}Data,*lpdata;//我把data改成了Data,否则会引起麻烦。

原文中的DWORD recvdata,flag;
lpdata d;

改为:DWORD recvdata = 0;
lpdata d;
d = (lpdata)malloc(sizeof(Data));

d->Overlapped.Internal = 0;
d->Overlapped.InternalHigh = 0;
d->Overlapped.Offset = 0;
d->Overlapped.OffsetHigh = 0;
d->Overlapped.hEvent = NULL;

d->DataBuf.buf = d->Buffer;
d->DataBuf.len = DATA_BUFSIZE;

别忘了free()哦
希望你的问题早日解决。



dingpiao 2005-10-11
  • 打赏
  • 举报
回复
网上有很多IOCP例子啊,都没有这个错 帮助说10014是所请求的地址是广播地址
umbrella1984 2005-10-11
  • 打赏
  • 举报
回复
楼上2星的老大,地址无效是指socket无效还是什么,我可以发送信息到那个socket啊,而且客户端也收到了。郁闷。。。
是是非非 2005-10-11
  • 打赏
  • 举报
回复
不懂,帮顶蹭粪
umbrella1984 2005-10-11
  • 打赏
  • 举报
回复
忘记写上变量定义部分了,如下:

#define DATA_BUFSIZE 4096
#define RECV_POSTED 0
#define SEND_POSTED 1

HWND CCompletionPortServerDlg::hwnd=NULL;
SOCKET CCompletionPortServerDlg::server;
SOCKET CCompletionPortServerDlg::client;
SOCKADDR_IN CCompletionPortServerDlg::serveraddress;
SOCKADDR_IN CCompletionPortServerDlg::clientaddress;

HANDLE CCompletionPortServerDlg::myport;
HANDLE CCompletionPortServerDlg::myworkthread;

extern UINT AcceptClient(LPVOID);
extern DWORD WINAPI RecvData(LPVOID);

typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
char Buffer[DATA_BUFSIZE];
int OperationType;
}data,*lpdata;

typedef struct
{
SOCKET s;
SOCKADDR_IN addr;
}clientdata,*lpclientdata;
DentistryDoctor 2005-10-11
  • 打赏
  • 举报
回复
IOCP的示例,请到www.codeproject.com下个示例看一下。
DentistryDoctor 2005-10-11
  • 打赏
  • 举报
回复
地址无效。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧