소켓 통신중 문제가 발생하였는데 원인을 짐작할 수가 없습니다.
글쓴이: morgana / 작성시간: 월, 2008/09/29 - 6:46오후
안녕하세요. 소켓 통신중에 문제가 발생했는데,
원인을 짐작할수가 없어 이렇게 도움을 청합니다.
상황은 이렇습니다.
기존 우분투 서버에서 작업한 결과물을 centos5에 올려 컴파일 하여
프로그램을 동작 시키고 클라이언트 프로그램으로 접속을 한 후
해당 모듈이 정상적으로 동작 하나 테스트 하였더니,
정상적으로 동작하지 않아 메시지를 몇개 심어보았더니,
'Connection timed out'라는 메시지를 확인 할 수 있었습니다.
학교 전산실에 이야기해서, 저희 학과 서버로 오가는 모든 포트를 개방하였습니다.
(학과 서버 관리자에게 문의 해보니 학과 홈피 APM이 돌고 있는 서버랍니다.)
기존 우분투 서버에서는 정상적으로 작동함을 여러차례 확인 하였습니다.
대략의 코드는 다음과 같고 내용은 SMS호스팅 업체에 접속하여 필요한 정보를 전달하는 함수입니다.
void Snd_SMS(int argc, char *argv) { struct hostent *hp; int t,n,sock, clnt_len, serv_len,msglen,sendmsglen; struct sockaddr_in serv_addr, clnt_addr; server_name = "sms.gabia.com"; clientmsg = get_packet_info(argv); if((hp=gethostbyname(server_name)) == NULL) { fprintf(stderr, "gethostbyname failed\n"); //exit(2); } else { printf("gethostbyname is success!\n"); } serv_len=sizeof(serv_addr); memset((char *)&serv_addr, '\0',serv_len); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(PORTNUM); memcpy((char *)&serv_addr.sin_addr, hp->h_addr, hp->h_length); printf("%d\n",hp->h_addr); if((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error"); //exit(3); } else{ pritnf("socket bind success!\n"); } if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) <0) { perror("connect error: \n"); //exit(4); } if( sendto(sock, clientmsg, strlen(clientmsg), 0,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) == -1 ) perror("send error\n"); if((n=recv(sock, reply, MAXMSG, 0) < 0)) { //printf("n=%d\n",n); printf("recv error\n"); //exit(6); }else { printf("send to server : %s\n",clientmsg); printf("%s\n",reply); //exit(0); close(sock); } }
대략 다음과 같은 메시지들을 받았습니다.
gethostbyname is success!!
socket bind success!
connect error: Connection timed out
send error: Broken pipe
recv error
Sns_SMS is End!!
작업하던 서버에서 잘 동작 하는걸 보면, 환경이 바뀌면서 뭔가 다른 작업을 해줘야 할듯 싶기도한데,
어디를 손대야 할지 모르겠네요. 힌트좀 주세요 ㅠㅠ
Forums:
tcpdump
tcpdump 나 ip dump 프로그램을 이용해.
실제 패킷을 우선 확인해 보시는게 좋을듯합니다.
[KILL] 죽을각오로.........
[KILL] 죽을각오로.........
소스가 이상하네요
tcp같은데 sendto()를 사용하나요?
오래된 소스같군요...
없음
connect가 실패하는걸로 봐서
serv_len=sizeof(serv_addr);
memset((char *)&serv_addr, '\0',serv_len);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORTNUM);
memcpy((char *)&serv_addr.sin_addr, hp->h_addr, hp->h_length);
printf("%d\n",hp->h_addr);
이부분을
memset( &serv_addr, 0x00 , sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORTNUM);
serv_addr.sin_addr.s_addr = *(u_long *) hp->h_addr_list[0];
이렇게 바꿔보세요
노트북을 학교로 가져가서 해본 결과.
소스에 문제 있는것은 아닌것 같습니다.
노트북(작업하던 서버/외부에서정상 동작)을 들고 가서 테스트해본결과 마찬가지로
connect가 마찬가지로 실패 하더군요.(timed out)
tracepath를 사용해본 결과(
tracepath sms.gabia.com/5000
)정상적으로 찾아가는것을 확인하였는데... -_-;;;;;;;;;;;;;
어떤 부분들을 더 확인해 확인해 봐야 할까요?
답변해주신분들 감사합니다(_ _)
=======================================
아프다...
=======================================
.
댓글 달기