소켓 통신중 문제가 발생하였는데 원인을 짐작할 수가 없습니다.

morgana의 이미지

안녕하세요. 소켓 통신중에 문제가 발생했는데,
원인을 짐작할수가 없어 이렇게 도움을 청합니다.

상황은 이렇습니다.
기존 우분투 서버에서 작업한 결과물을 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!!

작업하던 서버에서 잘 동작 하는걸 보면, 환경이 바뀌면서 뭔가 다른 작업을 해줘야 할듯 싶기도한데,
어디를 손대야 할지 모르겠네요. 힌트좀 주세요 ㅠㅠ

park7275의 이미지

tcpdump 나 ip dump 프로그램을 이용해.
실제 패킷을 우선 확인해 보시는게 좋을듯합니다.

[KILL] 죽을각오로.........

[KILL] 죽을각오로.........

harisoo의 이미지

tcp같은데 sendto()를 사용하나요?

ihavnoth의 이미지

serv_addr.sin_addr = *(struct sockaddr *)hp->h_addr_list;
serv_addr.sin_addr.s_addr = inet_addr("100.100.100.100");
 
 
 
저랑 헤더화일이 다른건지.... hp에 h_addr이 없네요
 
memcpy((char *)&serv_addr.sin_addr, hp->h_addr, hp->h_length);
 
 
struct hostent *hp
 
netdb.h
 
struct hostent
{
  char *h_name;                 /* Official name of host.  */
  char **h_aliases;             /* Alias list.  */
  int h_addrtype;               /* Host address type.  */
  int h_length;                 /* Length of address.  */
  char **h_addr_list;           /* List of addresses from name server.  */
#define h_addr  h_addr_list[0]  /* Address, for backward compatibility.  */
};

없음

linehat의 이미지

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];

이렇게 바꿔보세요

morgana의 이미지

소스에 문제 있는것은 아닌것 같습니다.

노트북(작업하던 서버/외부에서정상 동작)을 들고 가서 테스트해본결과 마찬가지로
connect가 마찬가지로 실패 하더군요.(timed out)

tracepath를 사용해본 결과( tracepath sms.gabia.com/5000)
정상적으로 찾아가는것을 확인하였는데... -_-;;;;;;;;;;;;;

어떤 부분들을 더 확인해 확인해 봐야 할까요?

답변해주신분들 감사합니다(_ _)

=======================================
아프다...

=======================================
.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.