2011-11-03 3 views
0

TCP 소켓을 통해 큰 문자열이 아닌 일부를 보냅니다. 오늘 나는 2031 바이트를 보내고받는 쪽이 모든 것을 얻지 못했다. (나는 더 큰 메시지를 보낸다. 2040 년 전에) -이 모든 것이 나쁜 것은 아니며, 프로그램은 뭔가 잘못되었다는 것을 알고 데이터를 다시 보낸다. 세 번째 시도는 성공했습니다.) 이제 메시지를 작은 덩어리로 분리하여 루프 문으로 보내야하는지 궁금합니다. 내 코드에 누락 된 것이 있습니까?tcp 소켓을 사용하여 큰 데이터를 보내야합니까?

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
sock.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,0); 
sock.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Socket,SocketOptionName.SendTimeout,0);   
LingerOption lingerOption = new LingerOption (true, 1); 
sock.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Socket,SocketOptionName.Linger, lingerOption); 
sock.Blocking = true; 

try 
{ 
    sock.Connect(_dostHostEp); 
} 
catch(SocketException e)      
{          
    sock.Close(); 
    throw new Exception("Connection error (" + _dostHostEp.Address + ":" + _dostHostEp.Port + ")" + e.Message);    
} 

try  
{ 
    sock.Send(Encoding.UTF8.GetBytes(message));        
} 
catch(SocketException e) 
{     
    sock.Close();    
    throw new Exception("Error while sending message to (" + _dostHostEp.Address + ":" + _dostHostEp.Port + ")" + e.Message);    
} 
+1

가능한 복제본 [C# Async Sockets Server 수신 문제] (http://stackoverflow.com/questions/5934469/c-sharp-async-sockets-server-receive-problems) – jgauffin

+0

복제본에 "async"가 있지만 문제는 실제로 똑같습니다. 연결된 질문에서 내 대답을 읽으십시오. – jgauffin

답변

0

왜 하나의 청크에서 2031 바이트를 가져 오라고 주장합니까? 오히려 데이터가 존재할 때까지 수신자 측 에서 데이터를 읽어야합니다. 즉, 예를 들어 1800 바이트의 청크, 231 바이트의 다른 청크 및 데이터의 끝을 의미하는 0 바이트를 읽습니다.

+0

-1 0 번은 종료를 의미하지 않으며 "연결 해제"를 의미합니다. 더 많은 데이터를 사용할 수있을 때까지'Read'가 리턴되지 않습니다. – jgauffin

+0

하나의 청크에서 2031 바이트를 얻으려고하지 않습니다. 수신은 다른 사람이 수행합니다. 내 질문에 byte 배열 배열 socket.Send 메서드에 전달 된 제한이 있다면? –

+0

내 연결된 답변 읽기. 수신자가 보낸 모든 것을 수신자에게 보장 할 수는 없습니다. TCP는 그렇게 작동하지 않습니다. 즉, 얼마나 많은 데이터를 전송 하느냐는 문제가되지 않습니다 (소켓 구현 내부 버퍼를 오버플로하지 않는 한). – jgauffin

0

필자는 항상 잘 정의 된 최종 문자 나쁜 습관없이 데이터를 보내는 것을 고려해 왔습니다. 다음을 직접 수행하는 것이 좋습니다.

보낸 사람으로 메시지 앞에 STX- 문자 (0x02)를 추가하고 ETX- 문자 (0x03)를 추가하십시오.

수신자는 STX를 새 메시지의 시작으로 인식하고 ETX가 수신 될 때까지 읽어야합니다 (차단?). 적절한 시간 내에 ETX가 수신되지 않으면 전체 메시지를 읽는 중 문제가 발생했습니다.

STX 및 ETX를 사용할 필요가 없으며 \ r \ n 또는 메시지 자체에 포함되지 않은 것도 사용할 수 있습니다.

잘 정의 된 메시지 끝을 사용하지 않으면 독자는 언제 읽는 것을 중단해야하는지 결코 알 수 없으며 의사 소통을 망칠 것입니다. 나는이 문제로 indentified 한

하나의 샘플 케이스 :

보낸 사람이 두 개의 메시지 하나씩을 보냅니다. EndOfMessage 문자가 없으면 수신자는이를 하나의 단일 메시지로 읽으려고 시도합니다. EOM을 사용하면 수신자가 두 메시지를 분리하여 처리 할 수 ​​있습니다.

+1

링크 된 질문에서 내 대답을 반복하는 대신 복제본으로 닫으 려하지 않는 이유는 무엇입니까? – jgauffin

+1

당신이 복제본에 대한 논평을하기도 전에이 답장을 쓰기 시작했기 때문입니다. –

관련 문제