完成端口的一些技巧

1、在程序创建监听套接字时,使用socket函数创建一个套接字时,总是报“INVALID_SOCKET”错误?
原因:出现此问题的原因,很可能是因为没有正确执行WSAStartUp函数引起的;
解决方法:请检查,是否使用WSAStartUp对winsock进行了初始化工作?如果进行了初始化,请检查初始化是否成功?

2、使用WSASend或WSARecv投递相应的发送或接收请求后,始终没有收到相应的GET函数完成返回通知?
原因:出现此问题的原因,绝大多数是因为函数参数没有进行正确的赋值。
解决方法:在执行wsasend和wsarecv操作前,请先将overlapped结构体使用memset进行清零。一个正确的调用格式如下:
发送操作
 DWORD ByteSend=0;
 DWORD Flags=0;
 int tmpResult=0;
     ......
 PPerHandleData tmpData;
 ......
 memset(&(tmpData->Overlapped), \0, sizeof(OVERLAPPED));//将overlapped结构清空
 tmpData->Statu = ssSend;
    tmpResult = WSASend(tmpData->socket, &(tmpData->WSASendBuffer), 1,
  &ByteSend,
    Flags,
    &(tmpData->Overlapped),
    NULL);

接收操作
 DWORD byteRecv=0;
 DWORD Flags=0;
 int tmpResult=0;
 ......
 PPerHandleData myHandlData;
 ......
 memset(&(myHandlData->Overlapped), \0, sizeof(OVERLAPPED));
 memset(myHandlData->RecvBuffer, \0, CLIENT_BUFFER_SIZE);
 myHandlData->WSARecvBuffer.buf = myHandlData->RecvBuffer;
 myHandlData->WSARecvBuffer.len = CLIENT_BUFFER_SIZE;
 myHandlData->socket = myClient->m_ClientSocket;
 myHandlData->Statu = ssRecv;

 tmpResult = WSARecv(myHandlData->socket, &(myHandlData->WSARecvBuffer), 1, (LPDWORD)&byteRecv, (LPDWORD)&Flags, (LPWSAOVERLAPPED)&(myHandlData->Overlapped), 0);


3、当投递了一个WSARecv或WSASend请求后,总是返回“ERROR_IO_PENDING”错误?
原因:“ERROR_IO_PENDING”,表示的是WSARecv或WSASend操作正在执行中,还没有执行完毕。
解决方法:此错误可以直接忽略,如果参数设置正确,当操作完成时,系统会通过GET函数返回执行的形式来通知发送或接收操作已经完成。
If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lpNumberOfBytesTransferred, lpCompletionKey, and lpOverlapped parameters.
如果函数从完成端口的一个成功 I/O 操作取出一个完成包,返回值为非 0 。函数在指向 l pNumberOfBytesTransferred , lpCompletionKey, and lpOverlapped 的参数指针中存储相关信息。
If *lpOverlapped is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the lpNumberOfBytes and lpCompletionKey parameters. To get extended error information, call GetLastError. If the function did not dequeue a completion packet because the wait timed out, GetLastError returns WAIT_TIMEOUT.
如果 *lpOverlapped 为空并且函数没有从完成端口得到完成包,返回值为 0 ,函数则不会再 lpNumberOfBytes and lpCompletionKey 所指向的参数中存储信息。调用 GetLastError 可以得到一个扩展信息。如果函数因为等待超时未能得到完成包, GetLastError 返回 WAIT_TIMEOUT.
If *lpOverlapped is not NULL and the function dequeues a completion packet for a failed I/O operation from the completion port, the return value is zero. The function stores information in the variables pointed to by lpNumberOfBytes, lpCompletionKey, and lpOverlapped. To get extended error information, call GetLastError.
如果 *lpOverlapped 不为空并且函数从完成端口的一个失败 I/O 操作得到完成包,返回值为 0 ,函数在指向 l pNumberOfBytesTransferred , lpCompletionKey, and lpOverlapped 的参数指针中存储相关信息。调用 GetLastError 可以得到扩展错误信息
FROM:http://vieri.blogdriver.com/vieri/

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值