解决:阻塞模式下(blocking)WSARecv失败,error为WSA_IO_PENDING(997)、WSAEOPNOTSUPP (10045)...

47 篇文章 0 订阅

 

iMode设置为0,为阻塞模式;iMode为非0,为非宿在模式

//-------------------------
  // Set the socket I/O mode: In this case FIONBIO
  // enables or disables the blocking mode for the 
  // socket based on the numerical value of iMode.
  // If iMode = 0, blocking is enabled; 
  // If iMode != 0, non-blocking mode is enabled.
  u_long iMode = 0;
  ioctlsocket(m_socket, FIONBIO, &iMode);

 

1,非阻塞模式下,需要CreateEvent,如果为阻塞模式,则不用Create,要将倒数第二个参数lpOverlapped设为NULL,否则会出现WSA_IO_PENDING(997)错误。

 

2,无论是阻塞模式,还是非阻塞模式,需要将Flags设为0,否则会出现WSAEOPNOTSUPP (10045)错误。由于Flags是in_out类型,所以每次WSARecv前都要设为0。

 

WSAOVERLAPPED RecvOverlapped = {0};
RecvOverlapped.hEvent = WSACreateEvent();
if (RecvOverlapped.hEvent  == NULL) 
{
	fprintf(stderr, "WSACreateEvent failed: %d\n", WSAGetLastError());
	closesocket(ConnSocket);
	return;
}

WSABUF DataBuf;
DWORD RecvBytes, Flags = 0;

char buffer[4096];
DataBuf.len = 4096;
DataBuf.buf = buffer;
	  
int rc = WSARecv(ConnSocket, &DataBuf, 1, &RecvBytes, &Flags, &RecvOverlapped, NULL);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值