select로 connect에 타임아웃을 줬을경우 select의 반환값??

amiwinner의 이미지

struct sockaddr_in addr;
int iOption = 1;
SOCKET s;

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int flags = fcntl( s, F_GETFL, 0 );
fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0 );

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(szAddr);
addr.sin_port = htons(iPort);

int nResult = connect( s, (const struct sockaddr*)&addr, sizeof(addr) );
if( 0 != nResult )
{
if( EAGAIN != errno && EINPROGRESS != errno )
close(s);
}

fd_set rset, wset;
struct timeval delay;
int idelay = 0, n;

FD_ZERO(&rset);
FD_ZERO(&wset);

FD_SET(s, &rset);
FD_SET(s, &wset);

if( mdelay > 1000 )
{
idelay = mdelay / 1000;
mdelay -= idelay * 1000;
}

delay.tv_sec = idelay;
delay.tv_usec = mdelay * 1000;

n = select( s+1, &rset, &wset, NULL, &delay );

if( -1 == n )
close(s);
else if( 0 == n )
printf(" time out" );

if( FD_ISSET(s, &rset) || FD_ISSET(s, &wset) )
{
// 연결됬음 원하는 작업하기..
}

대충의 코드입니다. 몇일간 이 문제로 골머리네요.
대강보면 CONNECT()하고 나서 timeout이 나거나 아님..fd_isset()으로 검사해서 true이면
연결이 되었다보고 원하는 작업을 하면 되는데..

실제 작업된거를 보면 연결이 되지 않았음에도 불구하고 맨 마지막 코드의 fd_isset에서
true가 반환되어 작업을 할려고 합니다.

select는 결과값을 read, write set을 주었으니 2가 나오고요.

timeout도 걸리지 않습니다. (보통 1초를 줍니다.)

상대편에서 accept를 받는쪽도 응답도 없습니다.
그리고 accpet를 받는 프로세스를 죽여놔도 타임아웃도 걸리지 않도 fd_isset에서 true를 반환해
버리네요..

결론은 연결이 되지 않았음에도 불구하고 select는 정상적인 값을 리턴하고 fd_isset에서도
정상적인 값을 리턴한다..
이게 문제입니다.

혹시 이런 문제 경험하신분 계시면 조언좀 부탁드립니다. ㅠ.ㅠ.

beowulf의 이미지

readfs는 안보셔도 될것 같습니다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code/C/connectWithTimeout 를 참조해 보세요.

_____________________

evolution...

___

evolution...

댓글 달기

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