해결: 차단 모드(blocking) WSARecv 실패, error 는 WSA_IO_PENDING(997)、WSAEOPNOTSUPP (10045)

1340 단어 error

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
", 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);

좋은 웹페이지 즐겨찾기