소켓프로그래밍에서 connect()에러 확인 방법이 있나요..?

toold의 이미지

소스는 아래와 같습니다..
실행하면 connect() error가 출력됩니다..
무엇이 잘 못되어서 connect가 안되는지 확인하고 싶은데..
어케 확인 할 수 있을까요..?..
부탁드립니다..

int main()
{
	int connectSD;				//소켓 디스크립터
	struct sockaddr_in origin_addr;
	char *addr = "http://www.daum.kr";		
		
	if((connectSD = socket(PF_INET, SOCK_STREAM, 0)) < 0)
		error_handling("connectSD socket() error");

	memset(&origin_addr, 0, sizeof(origin_addr));
	origin_addr.sin_family = AF_INET;
	origin_addr.sin_addr.s_addr = inet_addr(addr);
	origin_addr.sin_port = htons(80);

	if(connect(connectSD, (struct sockaddr*)&origin_addr, sizeof(origin_addr)) == -1)
		error_handling("connect() error");

	return 0;
}
kukuman의 이미지

perror나 strerrno(errno)를 사용해 보세요~

Be at a right place at a right time...

toold의 이미지

답변 감사합니다.
perror로 에러를 확인했는데요..

Network is unreachable 이라고 나옵니다..
이런건 어떤 경우에 나는 에러인가요..?..
네트워크에 도달할 수 없다..?..
다시 한번 부탁드릴께요..^^...

purewell의 이미지

$ man connect

Quote:
(생략)
RETURN VALUE
If the connection or binding succeeds, zero is returned. On error, -1
is returned, and errno is set appropriately.

ERRORS
The following are general socket errors only. There may be other
domain-specific error codes.

EBADF The file descriptor is not a valid index in the descriptor ta-
ble.

EFAULT The socket structure address is outside the user's address
space.

ENOTSOCK
The file descriptor is not associated with a socket.

EISCONN
The socket is already connected.

ECONNREFUSED
No one listening on the remote address.

ETIMEDOUT
Timeout while attempting connection. The server may be too busy
to accept new connections. Note that for IP sockets the timeout
may be very long when syncookies are enabled on the server.

ENETUNREACH
Network is unreachable.

EADDRINUSE
Local address is already in use.

EINPROGRESS
The socket is non-blocking and the connection cannot be com-
pleted immediately. It is possible to select(2) or poll(2) for
completion by selecting the socket for writing. After select
indicates writability, use getsockopt(2) to read the SO_ERROR
option at level SOL_SOCKET to determine whether connect com-
pleted successfully (SO_ERROR is zero) or unsuccessfully
(SO_ERROR is one of the usual error codes listed here, explain-
ing the reason for the failure).

EALREADY
The socket is non-blocking and a previous connection attempt has
not yet been completed.

EAGAIN No more free local ports or insufficient entries in the routing
cache. For PF_INET see the net.ipv4.ip_local_port_range sysctl
in ip(7) on how to increase the number of local ports.

EAFNOSUPPORT
The passed address didn't have the correct address family in its
sa_family field.

EACCES, EPERM
The user tried to connect to a broadcast address without having
the socket broadcast flag enabled or the connection request
failed because of a local firewall rule.

CONFORMING TO
SVr4, 4.4BSD (the connect function first appeared in BSD 4.2). SVr4
documents the additional general error codes EADDRNOTAVAIL, EINVAL,
EAFNOSUPPORT, EALREADY, EINTR, EPROTOTYPE, and ENOSR. It also docu-
ments many additional error conditions not described here.

NOTE
The third argument of connect is in reality an int (and this is what
BSD 4.* and libc4 and libc5 have). Some POSIX confusion resulted in
the present socklen_t. The draft standard has not been adopted yet,
but glibc2 already follows it and also has socklen_t. See also
accept(2).

BUGS
Unconnecting a socket by calling connect with a AF_UNSPEC address is
not yet implemented.

SEE ALSO
accept(2), bind(2), listen(2), socket(2), getsockname(2)

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

toold의 이미지

Quote:

ENETUNREACH
Network is unreachable.

이 부분인것 같은데...
그 다음에 뭘 어찌해야하는건지...^^...
purewell의 이미지

ㅡ0-) 해당 네트워크에 도착할 수 없다는 말이지요.

connect를 위해 세팅해준 주소 구조체가 잘못되었거나,

아이피가 밖으로 나갈 수 없을 경우 등등...

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

맹고이의 이미지

char *addr = "http://www.daum.kr";

요게 잘못된 것 같은데요... ^^

daum.kr 이 아니라 daum.net이구요...

http:// 도 없어야 될 것 같습니다.

간단한 예제...

int main() { 
   int socket_fd; 
   struct sockaddr_in name; 
   struct hostent *hostinfo; 
   char *addr = "daum.net";       

   /* 소켓 생성 */ 
   socket_fd = socket(AF_INET, SOCK_STREAM, 0); 

   name.sin_family = AF_INET;

   /* hostname으로... */ 
   hostinfo = gethostbyname(addr); 

   if(hostinfo == NULL) /* 그런 곳 없음~ */
      return 1; 
   else 
      name.sin_addr = *((struct in_addr *)hostinfo->h_addr); /* 주소 저장 */
   name.sin_port = htons(80); /* 웹 서버 포트 */

   /* 웹 서버에 접속 */ 
   if(connect(socket_fd, (struct sockaddr *)&name, sizeof(struct sockaddr)) == -1) { 
      perror("connect"); 
      return 1; 
   } 

   /* 접속한 뒤 어쩌고 저쩌고... */ 

   return 0; 
}
toold의 이미지

답변 감사드립니다..
주소는 잘못 쳤구요..^^..
소스는 아래와 같은데요..
컴파일하면..
warning: passing arg 2 of `connect' from incompatible pointer type
라는 경고메세지가 뜹니다..
아무래도 저 경고 때문에 connect() error가 나는 것 같은데요..
아무리 봐도 잘못된 부분이 없는것 같은데...^^..
보시고 지적 좀 해주시면..감사....

void error_handling(char *message);

int main()
{
	int connectSD;				//소켓 디스크립터
	struct sockaddr_in origin_addr;
	char *addr= "www.daum.net";

	if((connectSD = socket(PF_INET, SOCK_STREAM, 0)) < 0)
		error_handling("connectSD socket() error");

	memset(&origin_addr, 0, sizeof(origin_addr));
	origin_addr.sin_family = AF_INET;
	origin_addr.sin_addr.s_addr = inet_addr(addr);
	origin_addr.sin_port = htons(80);

	if(connect(connectSD, (struct scokaddr*)&origin_addr, sizeof(origin_addr)) < 0)
		error_handling("connect() error");	

	return 0;
}

void error_handling(char *message)
{
	perror(message);
	exit(1);
}
맹고이의 이미지

말 그대로 입니다.

Quote:
warning: passing arg 2 of `connect' from incompatible pointer type

connect 함수의 두번째 인자의 포인터 타입이 안 맞다는 거죠...

connect() error는 런타임시 에러구요.

if(connect(connectSD, (struct scokaddr*)&origin_addr, sizeof(origin_addr)) < 0)

에서... 타입 캐스팅이 잘못됐네요.

(struct scokaddr*) 가

(struct sockaddr *) 로 되야겠죠.

오타를 주의하셔야 될 듯... 8)

아, 그리고 inet_addr() 보다는

inet_aton()이나 inet_pton()을 사용하는 게 더 좋을 것 같습니다.

Quote:
inet_addr() 함수는 수-점 표기인 인터넷 호스트 주소 cp를 네트웍 바이트 순서인
이진 데이터로 바꾼다. 만일 입력이 유효하지 않다면, INADDR_NONE (보통 -1)이
반환된다. 이 함수는 위에서 언급한 inet_aton에 대한 구식 인터페이스이다.; 이
함수는 쓸모없다. 왜냐하면 -1은 유효한 주소(255.255.255.255)이고, inet_aton는
에러가 리턴되었음을 가리키는 확실한 방법을 제공하기 때문이다.
toold의 이미지

우선 다른것도 알려주시고...감사합니다..꾸벅꾸벅...
근데..죄송한데요..맹고이님께서 알려주신대로 아래와 같이 바꿔도..
계속 같은 경고문이 뜹니다...ㅠ.ㅠ...
혹시 구조체 셋팅중에 이상한 부분이 있나요..?

	if(connect(connectSD, (struct scokaddr *) &origin_addr, sizeof(origin_addr)) < 0)
		error_handling("connect() error");	
맹고이의 이미지

Quote:
if(connect(connectSD, (struct scokaddr *) &origin_addr, sizeof(origin_addr)) < 0)
error_handling("connect() error");

안바꼈네요... ;;

Quote:
if(connect(connectSD, (struct sockaddr *) &origin_addr, sizeof(origin_addr)) < 0)
error_handling("connect() error");
toold의 이미지

^^.......
죄송...* 부분을 말씀하시는 줄 알았습니다..
감사합니다...

toold의 이미지

정말 질문이 꼬리에 꼬리를 무네요..
이번엔 경고는 안되는데..
실행은 역시 마찬가지로..

Network is unreachable 이라고 나옵니다..

혹시 구조체 셋팅 부분중에 이상한 부분이 있는지 봐주시면 감사...꾸벅...

맹고이의 이미지

toold wrote:
정말 질문이 꼬리에 꼬리를 무네요..
이번엔 경고는 안되는데..
실행은 역시 마찬가지로..

Network is unreachable 이라고 나옵니다..

혹시 구조체 셋팅 부분중에 이상한 부분이 있는지 봐주시면 감사...꾸벅...


connect 함수는 연결이나 바인딩이 성공하면,
0을 리턴하고 에러시 -1을 리턴합니다.
그러니까...

Quote:
if(connect(connectSD, (struct sockaddr *) &origin_addr, sizeof(origin_addr)) == -1)
error_handling("connect() error");

가 되야겠죠.

manpage도 잘 읽어보시길...

toold의 이미지

해결 했습니다..
맹고이님께서 알려주신 방법과..
address를 IP로 변환 후 하니까 되네요..^^...
지루한 질문에 관심 가져주셔서 감사합니다..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.