2013-07-18 3 views
0

소켓 패킷의 데이터를 패킷으로 읽고 다른 버퍼에 쓰고 모든 데이터를 결합했습니다.소켓에서 데이터를 읽는 것이 다음 조건에서 중단됩니까?

BOOL _ReadPacket(PBYTE BufferRead, DWORD &Length, SOCKET Socket) 
{ 
    WSABUF Buffer; 
    DWORD Flags = 0; 
    int Result = 0; 
    FILE *file; 
    Buffer.buf = (char *)BufferRead; 
    Buffer.len = Length; 
    Flags = 0; 
    Result = WSARecv(Socket, &Buffer, 1, &Length, &Flags, NULL, NULL); 

    // if ((file=fopen("D:/test/test1/test1.txt","a+")) != NULL) 
    //{ 
    //UINT val = Buffer.len; 
    //fprintf(file, "%d\n", val); 
    // 
    //fflush(file); 
    //fclose(file); 
    //} 
    return(Result != SOCKET_ERROR); 
} 

주석 처리 된 코드의 주석 처리를 제거하면 문제가 해결됩니다. 코드를 주석으로 남겨두면 왜 데이터가 손상됩니까?

+1

'BufferRead'가 합법적입니까? 'WSARecv'에서 오류가 발생합니까? 'WSA 초기화'(또는 무엇이든) 했습니까? –

답변

0

WSARecv의 네 번째 인수는받은 바이트 수를 가리키는 포인터 여야합니다. 그러나 버퍼의 길이에 포인터 주소를 전달하고 있습니다.

포인터를 포인터로 전달하는 경우 포인터가 아닌 포인터가 전달되면 이상하게 보일 수 있지만 아무 것도 손상시키지 않으므로 정상적으로 작동합니다. 그러나 지금은 그렇듯이, 그렇게해서는 안되는 곳을 쓰고있을 것입니다.

요약하면 네 번째 매개 변수를 확인하고 수정하십시오.

관련 문제