|
커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
|
|
|
|
| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
안드로히드 손님
|
올려짐: 2011.11.26 토, 7:27 pm 주제: TCP / IP통신에서 write() / read()에 관한 질문입니다. |
|
|
서버: 우분투(c언어로 작성), 클라이언트: 안드로이드
책에 보니까 write()가 반환되는 시점은 상대 호스트로 데이터의 전송이 완료되는 시점이 나닌, 전송할 데이터가 출력버퍼로 이동이 완료되는 시점이라고 나와있는데요...
이것때문에 제가 구현한 서버측 소스내에서 write()가 제대로 동작(?) 하지 않아 클라이언트에서 read()하면 타임아웃이 발생하는 것 같습니다.
일단 소스를 보시면,
| 코드: |
//이부분은 스레드를 생성하고 그 안에서 실행되는 부분입니다.
while(1) {
str_len=read(clnt_sock, protocol, sizeof(protocol));
if(str_len > 0) { //데이터를 읽음
printf("str_len : %d\n", str_len);
}
else {
printf("str_len : %d\n", str_len); //데이터가 없으므로 루프 반복
continue;
}
if(packet_valid_check(protocol, str_len) == 1) {
printf("패킷 정상 수신.\n");
}
else {
printf("정상적인 패킷이 아님.\n");
}
//패킷 분석(배열 인덱스3에 위치한 값이 프로토콜) ex) @.a.중간내용.#
switch(protocol[2]) {
// a라면...
case 'a':
result[0]='1';
write(clnt_sock, result, strlen(result));
break;
}
}
|
a라는 프로토콜을 전송하면 서버측에서는 읽고 패킷분석까지 하고 switch()내의 case문 까지 잘 진입합니다.
write함수 반환값을 받아보면 바이트 수까지 정확하게 찍습니다.
그리고 루프를 돌아 read()에서 블록 상태까지 대기까지 하는 것 같습니다.
근데 클라이언트쪽에서는 read()하면 타임아웃이 발생합니다....
제가 해본 방법으론는 서버측 write() 실행 후 버퍼에만 데이터가 남아있고 전송이 안된 것 같아 fflush(stdout); 넣어봤는데 안됐고요..
close(clnt_sock); 하니까 전송이 되네요... (이 방법은 한번 연결하고 끊어 버리기 때문에 다른 방법이 필요 합니다.)
한 일주일 이것때문에 여기저기 다 찾아보고 했는데 해답을 잘 못찾겠네요.
리눅스 DDD 디버거를 써볼려고 해도 사용법이 잘 안나와있어서 ...
조언 부탁드립니다. |
|
| 위로 |
|
 |
sCag 손님
|
올려짐: 2011.12.24 토, 12:29 pm 주제: 한번 line feed 쪽 체크해 보심이 |
|
|
질문은 오래 전에 하셨는데 -0-;;;
혹시나 그냥 \r\n 이나 \n 같은 라인피드 메시지를 보내야
제대로 받는 상황들도 있습니다.
디버깅도 디버깅이지만 일단 tcpdump로
패킷 먼저 보시고 해당 데이터가 잘 전송 되었는지 부터 찍어 보신후
디버깅 하시는게 나을것 같군요. |
|
| 위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB © 2001, 2005 phpBB Group
|