2017-09-07 14 views
0

저는 네트워크 프로그래밍에 익숙하지 않습니다. 나는 winsock2를 사용하여 간단한 비 블로킹 TCP 서버를 작성했지만, 이상한 방식으로 동작하여 이전에 묻는 질문에서 그 예제를 찾을 수 없었다.C++ 비 블로킹 TCP 서버가받은 것보다 많은 바이트로 메시지를 보낼 수 없습니다.

내 서버는 이전에받은 바이트 수만큼의 메시지 만 보낼 수 있습니다. 예를 들어 이전에 "rec_msg"를받은 경우 "message_to_send"를 보내려고하면 "message"만 보냅니다.

효과가 있지만 서버가 순수 정적 클래스로 캡슐화되어있는 경우에는 그렇지 않습니다. 여기를 받게되며 통해 기능하고 메시지를 보내

int TCPServer_Test::receiveMessage(){ 
    while(1) 
    { 
    memset(recvbuf, 0, DEFAULT_BUFLEN); 
    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); 
    int err = WSAGetLastError(); 
    int counter = 0; 
    if (iResult > 0) 
    { 
      std::cout << "Mesaj Alindi: " << recvbuf << std::endl; 
      break; 
    } 
    else if(err == WSAEWOULDBLOCK) 
    { 
      Sleep(200); 
      continue; 
    } 
    else if (iResult == 0){ 
    printf("Connection closing...\n"); 
     return -1; 
    } 
    else 
    { 
    printf("recv failed with error: %d\n", WSAGetLastError()); 
    closesocket(ClientSocket); 
    WSACleanup(); 
    assert(false); 
    } 
    } 
} 
void TCPServer_Test::sendMessage(char* Source){ 
    strncpy(recvbuf, Source, DEFAULT_BUFLEN); 

    iSendResult = send(ClientSocket, recvbuf, iResult, 0); 

    if (iSendResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
    assert(false); 
    } 
    else if (iSendResult == 0) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
    assert(false); 
    } 
    else 
    { 
     printf("Bytes sent: %d\n", iSendResult); 
    } 
    memset(recvbuf, 0, sizeof(recvbuf)); 
} 

내가 어떤 도움 직접 관련 여부를 감사하겠습니다. 또한

size_t bytes_count_to_be_send = strlen(Source); 
iSendResult = send(ClientSocket, Source, bytes_count_to_be_send, 0); 

:이 같은 전송 될 데이터를 전송하는 대신 데이터의 실제 크기를 제공 할 때 이전 recv 통화 중 수신 된 데이터의 양을 포함 iResult 변수를 사용하고 있기 때문에 그런 일이 같은

답변

4

같습니다 버퍼에 데이터를 복사 할 필요가 없다는 것을 알아 두십시오.

+1

또한 수신 코드는 수신 된 데이터가 null로 끝났다고 가정되지만 보장되지는 않습니다. 그것은'recv'의 반환 값을 사용하여'std :: cout'에 얼마나 많은 양의 데이터가 기록되는지를 제한해야합니다. –

+0

@RemyLebeau'recv' 코드에 대한 또 다른 의심스러운 점은 버퍼 크기가 먼저 DEFAULT_BUFLEN으로 표현되지만 그 다음으로 'recvbuflen'. – VTT

+0

@RemyLebeau 실제 코드에서 널 종료의 가정은 없으며, 그 cout은 단순화를 얻으려는 시도이지만 대체로 대단히 감사합니다. –