시스템관리자의 쉼터 커피닉스 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

가입없이 누구나 글을 쓸 수 있습니다. 공지사항에 대한 댓글까지도..




BBS >> 설치, 운영 Q&A | 네트웍, 보안 Q&A | 일반 Q&A || 정보마당 | AWS || 자유게시판 | 구인구직 || 공지사항 | 의견제시
TCP / IP통신에서 write() / read()에 관한 질문입니다.

 
글 쓰기   답변 달기    커피닉스, 시스템 엔지니어의 쉼터 게시판 인덱스 -> 네트웍 관리 / 보안
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
안드로히드
손님





올리기올려짐: 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로
패킷 먼저 보시고 해당 데이터가 잘 전송 되었는지 부터 찍어 보신후

디버깅 하시는게 나을것 같군요.
위로
이전 글 표시:   
글 쓰기   답변 달기    커피닉스, 시스템 엔지니어의 쉼터 게시판 인덱스 -> 네트웍 관리 / 보안 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 있습니다
답글을 올릴 수 있습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB © 2001, 2005 phpBB Group