2010-12-11 4 views
2

흥미로운 C 소켓 문제가 발생했습니다.C 소켓 - 한 번에 두 개 이상의 문자열을 임의로 수신합니다.

들어오는 문자열을 수신하고 있으며, 처음 2 ~ 4 개의 문자열에 대해 동시에 3 개의 문자열을 임의로 수신하게됩니다.

예를 들어 다음 들어오는 문자열을 받았습니다.

1~message~i love you\r\n 
2~message~do you love me?\r\n 
3~message~when are we going to meet again?\r\n 
4~message~How about now?\r\n 
5~message~Oh! I'm pregnant!\r\n 

내가받은 메시지의 수를 추적하는 카운터를 추가 카운터 가끔은 처음 3 문자열을 계산하지 않는 것으로 나타났습니다. 예를

1~message~i love you\r\n 
->Line 1 received 
2~message~do you love me?\r\n 
3~message~when are we going to meet again?\r\n 
4~message~How about now?\r\n 
->Line 2 received 
5~message~Oh! I'm pregnant!\r\n 
->Line 3 received 

를 들어 다음은 내가 자바 NIO로 코딩 할 때이 문제가 나타나지 않았기 때문에 이런 일이 왜 잘 모르겠어요 줄 번호

int lineNo = 1; 
while ((recvBytes = recv(clntSockfd, buffer, sizeof(buffer), 0)) > 0) { 
    printf("%s", buffer); 
    memset(&buffer, 0, sizeof(buffer)); 
    printf("Line %d received\n", lineNo++); 
} 

인쇄에 내 코드입니다.

의견이 있으십니까?

답변

0

어떤 연결 유형을 사용하고 있습니까?

UDP는 대부분 신뢰할 수 없습니다.

TCP는 신뢰성 측면에서 UDP보다 훨씬 뛰어납니다.

+0

안녕 Neilvert, TCP를 사용하고 있습니다. – Poliquin

1

줄 끝까지 읽지 않습니다. buffer두 줄 이상을 포함 할 수 있습니다.

8

TCP를 사용한다고 가정 할 때 recv()와 관련된 "메시지"(또는 "회선") 호출에 결함이 있습니다. TCP는 개념적으로 바이트 스트림입니다. 전송 운영 체제는 여러 수신 패킷을 단일 recv() 호출로보고 할 수있는 수신 운영 체제 (버퍼가 충분히 크다고 가정)와 같이 여러 send() 호출을 단일 IP 패킷으로 자유롭게 그룹화 할 수 있습니다. recv 호출을 통해 들어오는 패킷을 분할 할 수도 있습니다.

정말 메시지 구조를 데이터 자체에 넣어야합니다. 수신 된 데이터에서 줄 바꿈을 검색합니다.

자바에서 발생하지 않았다는 것은 순전히 행운이었다.

+0

루프백을 통해 패킷을 보낸 크기가 커지는 경향이 있습니다. 그러나 실제 네트워크에서는 패킷 병합을 피하는 것이 매우 어렵습니다. 약 100 밀리 초 간격으로 패킷을 보내면 일반적으로 보내지는 크기의 패킷을 얻지 만이 동작에 의존해서는 안됩니다. –

+0

안녕 얘들 아, 머리를 주셔서 고마워. 마틴이 제안한 줄 바꿈을 스캔 할 것 같아. 저녁 내내 생각하고 있었어. 내가 돌아 왔으니 아마 그걸 조금 더 포터가 할거야. strtok() 및 strtok_r()을보고있었습니다. strtok_r()은 문서가 쓰레딩에 좋다고 말하기 때문에 더 나은 방법입니다. 또한, "1 ~ message ~ I love you \ r \ n"문자열을 "1" "message" "I love you"의 각 토큰으로 분할하려고합니다. – Poliquin

관련 문제