2013-01-01 7 views
0

지금까지는 비 차단 채팅 서버를 작성했지만 서버는 정상적으로 작동하지만 부분 전송이 발생하면이를 해결하는 방법을 알 수 없습니다. send (int, char *, int); 함수는 항상 성공시 0을 반환하고 실패한 경우에는 -1을 반환합니다. 필자가 읽은 모든 doc/man 페이지는 실제로 네트워크 버퍼에 공급되는 바이트 수를 반환해야한다고 말합니다. 나는 서버에 데이터를 보내고 recv를 문제없이 반복적으로 수행 할 수 있는지 확인했다.Berkeley Socket 보내기 성공적인 비 차단 전송시 0을 반환합니다.

이것은 보내기를 호출하는 데 사용하는 기능입니다. 둘 다 콘솔에 반환 데이터를 먼저 인쇄하려고 시도한 다음 ReturnValue에 줄 바꿈을 시도했습니다. 디버깅하는 동안. 동일한 결과, ReturnValue는 항상 0 또는 -1입니다.

int Connection::Transmit(string MessageToSend) 
{   
    // check for send attempts on a closed socket 
    // return if it happens. 
    if(this->Socket_Filedescriptor == -1) 
     return -1; 

    // Send a message to the client on the other end 
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions. 
    ReturnValue = send(Socket_Filedescriptor, 
         MessageToSend.c_str(), 
         MessageToSend.length(), 
         0); 

    return ReturnValue;   
} 
+1

반환 값이 -1이면 어떤 오류가 발생합니까? 'errno'의 값을 확인하거나'perror'를 사용하십시오 –

+1

'send'가'-1'을 반환하면 POSIX 시스템 (Linux 또는 OSX)에서'errno'를 확인하거나 Windows에서'WSAGetLastError'를 사용해야합니다. 이것은 무엇이 잘못되었는지 이해하는 데 도움이됩니다. –

+0

'send (int, char *, int);'버클리 소켓'send'와 정확히 일치하지 않습니다. 어떤 플랫폼을 사용하고 있습니까? 'send' 대신'write'를 사용하려고 했습니까? –

답변

0

왜 루프를 보내지 않으시겠습니까? 예를 들어 :

int Connection::Transmit(string MessageToSend) 
{   
    // check for send attempts on a closed socket 
    // return if it happens. 
    if(this->Socket_Filedescriptor == -1) 
     return -1; 

    int expected = MessageToSend.length(); 
    int sent  = 0; 

    // Send a message to the client on the other end 
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions. 
    while(sent < expected) { 
     ReturnValue = send(Socket_Filedescriptor, 
         MessageToSend.c_str() + sent, // Send from correct location 
         MessageToSend.length() - sent, // Update how much remains 
         0); 
     if(ReturnValue == -1) 
     return -1; // Error occurred 
     sent += ReturnValue; 
    } 

    return sent;   
} 

코드가 지속적으로 오류 중 하나가 발생하거나 모든 데이터가 성공적으로 전송 될 때까지 모든 데이터를 보내려고 할 것이다 이런 식으로.

+0

나는 이것과 비슷한 것을 처음에 시도했다. 내 서버가 무한 루프에 빠지면서 내 클라이언트가 동일한 메시지 반복으로 스팸 메일을 받았습니다. 리턴은 항상 0이었는데, 매번 시도 할 때마다 모든 데이터를 보냈지 만. – user1908813

+0

죄송합니다 - 원래 게시물을 수정했습니다. 나는 0을 체크하기위한 간단한 조건을 추가했다.'send' 호출이 0을 반환하면 소켓이 닫혔다는 것을 기억하자. – RageD

+0

사실 그것이 제가 얻은 결과라면, 문제가되지 않을 것입니다. 내 경우에는 소켓이 열린 상태로 유지되고 향후 읽기 및 쓰기 기능은 0의 결과를 나타냅니다. – user1908813