소켓 프로그램을 짜는데 타이머를 사용하려면.....

익명 사용자의 이미지

안녕하세요...
소켓프로그램을 짜고 있는데...
서버가 메세지를 보낸 뒤 일정시간 내에 클라이언트로 부터 응답이 없으면
메세지를 재전송하는 부분을 짜고 있습니다.
이 때 타이머를 구동하기 위해서 select라는 명령을 사용했는데요...

while(1)
{

if(z>5)
{
recv(sock2, rcvc, MAXMSG,0);
}

if(z>2)
{

send(sock2,sndc,MAXMSG,0);

}

FD_ZERO(&readfds);
FD_SET(sock2,&readfds);

tv.tv_sec=5; /* 5sec */
tv.tv_usec=0;

select(sock2+1, &readfds, 0, NULL,&tv);

if ( FD_ISSET(sock2,&readfds) ) /*5초내에 수신한 경우 ==> recv로 ....*/
{
z=10;
printf("\n within 5sec\n");

}

else /* 5초내에 수신하지 못한 경우 ==> 다시 전송 */
{

z=3;
printf("\n NOT in 5sec\n");

}

}

이렇게 짜고 있거든요...
근데 리눅스에서 짠 클라이언트랑 테스트 해보면 잘 되는데..
윈도우에서 짠 클라이언트랑 해보면 윈도우에서는 메세지를 보내지도
않았는데 서버쪽에서는 이상한 메세지들을 수신했다고 나타납니다.
왜 그런가요?
select명령 때문인거 같기는한데..
잘 모르겠습니다..
고수님들의 가르침 기다리겠습니다.

그럼 안녕히 계세요..

익명 사용자의 이미지

select()의 문제가 아니라...
아마 이기종간의 통신일 경우에 가끔 문제가 일어나지요..

window용으로는 어떤걸 사용했는지 궁금하네요..

MFC를 사용한건지 아니면 SDK로 프밍한건지..
또는 비베로 작업은 한건지..
이런거에 따라 아마 여러개를 테스트 해보셔야 할겁니다..

익명 사용자의 이미지

그리고 비베로는 뭔가요?

좀 가르쳐 주세요...

익명 사용자의 이미지

비베는 비주얼 베이직 말씀드린거구여...

MFC로 프로그램 하셧다면..

아마 Serialize부분에서 데이타 전송하는것이고..
보톤 데이 스트링을 >> 연산다로 데이타 넘겨서 전송하는 방식으로
알고 있습니다.

저도 이것을 테스트해봤는데..
원하는 형식으로 데이타가 넘어 오지 않더군여..

권하는 방식은 MFC보다는 이기종간의 통신일때는..
일반 Socket API로 작업하길 권합니다.. 물런 저의 생각입니다 ^^*

저더 저번에 짬을내서 MFC로 만든 클라이언트로
Linux에 작업서버로 받으니까..
좀 엉뚱한 데이타가 넘어오더군여 ^^
구래서 전 그냥 일반 API로 해보다가 잠시 홀딩된 상태임댜..

그리고 메리 크리스마스예여 ^^*

익명 사용자의 이미지

이기종간에 문제 때문에 데이타 송수신이 제대로 안될수 있다고 하셨는데..

그럼 제가 올린 소스에는 문제점이 없나요?

그리고 ...

타이머를 동작시키기 위한 명령어로 select말고 다른 명령은 없나요?

꼭 답장 주세요..

그리고 메리 크리스마스 !!

익명 사용자의 이미지

Code 인경우 님처럼 복잡하게 안하고 간단하게 할수 있지요..

select(.......);
if(IS_FDSET())
{
resv(), 또는 read();
}
else
{
}

이렇게 처리하면 될듯 한데요...
즉 위에 다시 if문을 체크해서 할필요가 없다는거죠...

왜냐면 select()는
rdfs 같은 set에 등록 되어있는것에..
해당 디스크립터에 데이터가 들어왔다면 프래그가 설정되지요..
그 프래그를 보고 예ㅒ가 데이터가 왔다 안왔다를 파악하는게
select()이지요...
그러니 IS_FDSET()에 체크가 안걸리면 5초내에 데이터가 안들어온것이지
요..

추가적으로 select()은 5초내에 프래그가 셋 되면 리턴이 되는것도 참고하
세요..
5초가 지나기전에 프래그체크해서 셋 되어있다면...
바로 다음으로 넘어갑니다..

참 아마 그리구여 상대방이 통신을 종료할때도 아마 프래그가 셋 될겁니
다..
그래서 read()부에서 반드시 에러 체크를 해주세여..
그래야 select()가 에러 리턴 안됩니다 ^^*

이상 허접한 대답이었슴댜아 ^^

익명 사용자의 이미지


Source를 보니 별다른 이상이 보이지는 않는군요.
그리고 아래의 답변을 보니 어느정도 틀린 부분이
있는듯 하내요.

그리고 Window에서 작성을 한다고 해서, 기종이 다르다고 해서
서로 엉둥한 자료를 보내지는 않습니다.
제가 (win, unix(x86, hp, dec, ibm, sun...), host(메임프레임))
등에서 작업을 해 보았지만 그런 현상은 없었습니다.

window의 csocket class나 Socket Api나 큰 차이는 없습니다.
단지 class의 사용상의 문제는 있을 수 있습니다.

일단 의심이 가는 부분은 class의 선택이 하나인데,
윈도의 소스가 없으니 답변은 곤란하고.
두번째 의심 가는 것은 socket close인데 위의 소스에는
그런 것을 전혀 검사 하지 않네요.

일반적으로 stream(TCP Socket)은 Network Layer와 pipe로 연결되는데요.
이때 network쪽에서 Disconnect되면 stream(Socket)쪽은 자료가 도착
된 것처럼 보이지만 recv(read)하면 자료는 size=0가 되는데요.
이것은 network단에서 disconnect를 의미 합니다.
즉 이때 "if ( FD_ISSET(sock2,&readfds) )"
의 조건은 TRUE가 된다는 이야기가 됩니다.

댓글 달기

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