검색결과 리스트
글
답변감사합니다... 찾아보니 자료가 몇개 더 있더군요... ^^
글쓴이: alonecrow 작성 일시: 수, 2003/07/09 - 6:34오후
찾아보니 자료가 더 있어 소스한개를 더 올립니다.
UNIX Networking programming 에 있는 소스입니다.
두가지 모두 테스트 해보았는데 모두잘되더군요...
int connect_nonb(int sockfd, char *strIP) { int len=0, status, flags; struct sockaddr_in address; fd_set rset, wset; struct timeval tval; address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(strIP); address.sin_port = htons(SMTP_PORT); len = sizeof(address); #ifdef TEST printf("Connect IP:%s\n", strIP); #endif // Non Block 모드로 만든다. flags = fcntl(sockfd, F_GETFL, 0); if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) { #ifdef TEST switch (errno) { case EACCES: fprintf(stderr,"EACCES\n"); break; case EAGAIN: fprintf(stderr,"EAGAIN\n"); break; case EBADF: fprintf(stderr,"EBADF\n"); break; case EDEADLK:fprintf(stderr,"EDEADLK\n"); break; case EFAULT: fprintf(stderr,"EFAULT\n"); break; case EINTR: fprintf(stderr,"EINTR\n"); break; case EINVAL: fprintf(stderr,"EINVAL\n"); break; case EMFILE: fprintf(stderr,"EMFILE\n"); break; case ENOLCK: fprintf(stderr,"ENOLCK\n"); break; case EPERM: fprintf(stderr,"EPERM\n"); break; } #endif return -1; } status = connect(sockfd, (struct sockaddr *)&address, len); if ((status < 0) && (errno == EINPROGRESS)) { #ifdef TEST fprintf(stderr, "errno: %d\n", errno); switch (errno) { case EBADF: fprintf(stderr,"EBADF\n"); break; case EFAULT: fprintf(stderr,"EFAULT\n"); break; case ENOTSOCK: fprintf(stderr,"ENOTSOCK\n"); break; case EISCONN: fprintf(stderr,"EISCONN\n"); break; case ECONNREFUSED: fprintf(stderr,"ECONNREFUSED\n"); break; case ETIMEDOUT: fprintf(stderr,"ETIMEDOUT\n"); break; case ENETUNREACH: fprintf(stderr,"ENETUNREACH\n"); break; case EADDRINUSE: fprintf(stderr,"EADDRINUSE\n"); break; case EINPROGRESS: fprintf(stderr,"EINPROGRESS\n"); break; case EALREADY: fprintf(stderr,"EALREADY\n"); break; case EAGAIN: fprintf(stderr,"EAGAIN\n"); break; case EAFNOSUPPORT: fprintf(stderr,"EAFNOSUPPORT\n"); break; case EACCES: fprintf(stderr,"EACCES\n"); break; case EPERM: fprintf(stderr,"EPERM\n"); break; default: fprintf(stderr,"예외\n"); break; } #endif return -1; } if (status == 0) goto done; FD_ZERO (&rset); FD_SET (sockfd, &rset); wset = rset; tval.tv_sec = TIMEOUT; tval.tv_usec = 0; if ((status = select(sockfd + 1, &rset, &wset, NULL, TIMEOUT ? & tval : NULL)) == 0) { close(sockfd); errno = ETIMEDOUT; return (-1); } if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) { len = sizeof(errno); if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &errno, &len) < 0) return (-1); } else { fprintf(stderr, "SELECT error: sockfd not set"); return (-1); } done: fcntl(sockfd, F_SETFL, flags); if (errno) { close(sockfd); return (-1); } return (0); }
»
alarm signal을 이용하시면 간단한데...[code:1]
글쓴이: 은빛연어 작성 일시: 목, 2003/07/10 - 9:42오전
alarm signal을 이용하시면 간단한데...
signal(SIGALRM, socket_timeout); alarm(1); state = connect(sockfd, (struct sockaddr *)&address, len); if (state < 0) { alarm(0); return(-1); } alarm(0); .... 나중에 socket_timeout 함수만 구현해주면 끝나염..
이렇게 하면 간단하게 구현할 수 있습니다~~~ 참조하세요~
»
[quote="은빛연어"]alarm signal을 이용하시면 간단한데..
글쓴이: fanuk 작성 일시: 월, 2003/07/14 - 2:17오후
은빛연어 wrote:
alarm signal을 이용하시면 간단한데...
signal(SIGALRM, socket_timeout); alarm(1); state = connect(sockfd, (struct sockaddr *)&address, len); if (state < 0) { alarm(0); return(-1); } alarm(0); .... 나중에 socket_timeout 함수만 구현해주면 끝나염..
이렇게 하면 간단하게 구현할 수 있습니다~~~ 참조하세요~
아.. 이거 좋군요..;; recv()에 대해서도 똑같이 적용할 수 있나요? 있을거 같긴 한데.. 흠..
'Network > socket(c&c++)' 카테고리의 다른 글
TCP/IP 통신 함수 사용 순서 (0) | 2012.10.22 |
---|---|
socket connect 함수의 처리시간의 조정 방법 (0) | 2012.10.19 |
The C10K problem (0) | 2012.10.19 |
TCP 기반의 소켓 통신 101 (0) | 2012.10.19 |
non-block / block 혼합 구현 서버 소스 (0) | 2012.10.19 |
타임아웃.. 예외없이 SELECT로 해결하시면 될듯합니다. 다만 CONN
타임아웃.. 예외없이 SELECT로 해결하시면 될듯합니다. 다만 CONNECT시 응답이 늦으면 완전히 블락이 걸리는 특성이 있으니 이전에 넌블락 모드로 설정하신후에 마지막에 이것을 해제해주시면 될듯합니다.
int status;
socket(); // 접속용 소켓 오픈
fcntl(); // 넌블락으로 셋
status = connect();
이부분에서 기종에 따라 리턴값이 달라집니다. 보통은 0보다 작으면서 PROGRESS메시지를 리턴하는데 이때 루프에 들어가 select 해주시면 됩니다.
while()
select(); 이부분은 쓰기검사를 하시고요.
connect();
대충 생각나는데로 해보았는데 저의 경험으로는 단지 리눅스용으로 하실거라면 이정도만 해도 잘 돌아 갑니다. 그런데 다른 기종에 포팅을 생각하시면 에러 리턴을 조금더 세밀하게 맞추셔야 할겁니다. 제가 LINUX/AIX/HPUX/SOLARIS 이렇게 맞추었는데 조금씩 다르더라구요.
시간이 되시면 모자익 소스를 한번 보시는게 어떠실런지요. 이거를 조금 수정하셔서 하시는게 좋을듯 싶습니다. 잠깐만요. 주소를 한번 찾아 보구요. 지금 찾았습니다.
아랫부분을 조금 수정하셔서 사용하시는게 어떠실런지요.
http://archive.ncsa.uiuc.edu/SDG/Software/XMosaic/