2016-12-25 1 views
-1

버퍼를 지정하지 않고 소켓에서 데이터를 받으려고합니다. 그래서 나는 들어오는 데이터 버퍼에서 x 바이트 만 제거하려고합니다.WinSock : 소켓에서 데이터를 제거하십시오.

는 다음 코드 (절단)이 있습니다

recv(gSocket, NULL, userDataLength, 0); 

을하지만 recv()의 반환 값 위의 코드를 실행할 때 SOCKET_ERRORWSAGetLastError() 반환 WSAECONNABORTED입니다. 게다가 내 연결이 끊어졌습니다.

질문 : 수신 기능을 사용하여 소켓의 RX 버퍼에서 데이터를 제거 할 수 있습니까?

+0

어디 버퍼 포인터가 null이 될 수 있다는 것을 말하는가? – EJP

+0

아무데도. 하지만 다른 소켓 라이브러리에서도 가능하기 때문에 가능하다고 생각했습니다. –

+1

나는 그런 라이브러리를 전혀 모르고 있지만 어쨌든 그것은 * 비 연속이다. * – EJP

답변

2

버퍼를 지정하지 않고 소켓에서 데이터를 수신하려고합니다.

죄송합니다. 바이트를 수신하려면 버퍼를 제공해야합니다. 바이트를 사용하지 않으려면 버퍼를 읽은 다음 버퍼를 버립니다.

그냥 들어오는 데이터 버퍼에서 x 바이트를 제거하고 싶습니다.

API가 없습니다. 바이트를 유효한 버퍼로 읽어야합니다. 나중에 그 버퍼로하는 일은 당신에게 달려 있습니다.

내가 recv()의 반환 값 위의 코드는 SOCKET_ERRORWSAGetLastError() 반환 WSAECONNABORTED입니다 실행

.

나는 대신 WSAEFAULT을 예상했을 것입니다.

소켓의 RX 버퍼에서 데이터를 제거하는 수신 기능을 사용할 수 없습니까?

물론 가능합니다. 당신은 단순히, 그냥 임시 버퍼 인 경우에도 버퍼에 바이트를 읽을 필요 예 :

int ignoreBytes(SOCKET sock, int numBytes) 
{ 
    u_char buf[256]; 
    while (numBytes > 0) 
    { 
     int numRead = recv(sock, (char*)buf, min(sizeof(buf), numBytes), 0); 
     if (numRead <= 0) 
      return numRead; 
     numBytes -= numRead; 
    } 
    return 1; 
} 

ignoreBytes(gSocket, userDataLength); 
+0

답을 고맙다. 나는 당신의 코드와 비슷한 바이트를 제거하거나 무시하는 함수를 작성했다. –

관련 문제