TCP 소켓 상태 확인

bueline의 이미지

TCP를 이용하여서 Client/Server 통신을 하려고 합니다.

서버쪽에서 Socket을 listen 상태로 대기중에 있을 때
지속적으로 소켓의 상태를 확인할 수 있는 방법이 있나요?
서버 자체적으로요

자체적으로 확인하다가 소켓에 이상이 있으면 다시 소켓을 열어줄려고 하는데요

두번째로 소켓을 정상적으로 열고있을 때
Client에서는 서버에 소켓에 정상접속해서 데이터를 보낸다고 하는데요
서버쪽에서는 read 함수를 사용해서 읽어봐도 데이터를 읽지 못하는데요
이럴 때 어떻게 정상적으로 통신하는지 확인할 수 있는 방법이 있을까요?

mirr187의 이미지

저 같은 경우는 주로 사용하는 language가 linux기반의 c인 관계로 c를 예로 들어서 얘기를 드리자면..

listen() 상태에서 대기중이다가 accept 하는게 일반적인 구조죠?

accept에서 return값이 -1이 발생하는 에러 상황을 체크하여 다시 socket fd를 생성합니다.

두번째 질문에 대해서는 linux 기반에서는 strace나 tcpdump를 사용하여 정말로 송수신되는 데이터가 없는지 여부를 확인합니다.
solaris 기반에서는 truss, tcpdump, snoop등을 사용하고요

bueline의 이미지

listen 상태에서 accept하고 있는데요
에러가 발생하지 않는데
Agent에서는 서버에 접속을 해서 데이터를 보냈다고 하네요
accept가 발생할 때에 에러가 발생하지 않기 때문에
서버 자체적으로 loop등을 통해서 확인할 수 있는 방법은 없을까요?

두번째도 마찬가지로 Client에서는 데이터를 보냈고
서버에 접속도 되었다고 하는데요
접속은 확인되었습니다
Client에 socket_fd값을 확인했습니다.
socket_fd값으로 read하면 데이터가 들어오지 않는데요
Client에서는 보냈다고 하기에 혹시 확인할 수 있는 방법이 있을까하고 문의합니다.

rexos33의 이미지

WireShark(http://www.wireshark.org)이라는 윈도우즈, 리눅스용으로 패킷 분석툴이 있습니다.

만약 정상적으로 클라이언트에서 보냈다면 wireshark에서 캡쳐될 겁니다.
캡쳐해서... 분석해보면 잘못된 곳을 금새 찾을 겁니다.
패킷이 캡쳐 안된다면 클라이언트에서 전송을 못해준거겠지요.

모두들 행복하세요~

bueline의 이미지

client에서 접속을 종료하면 -1값이 리턴되지 않나요?

mirr187의 이미지

- 첫번째의 경우
accept에서 에러가 발생하는 경우는 socket()으로 생성한 sockfd 값이 잘못되거나 accept단계에서 peer의 연결이 끊어졌음이 강제로 종료되었다던가 하는것입니다.

연결이 이루어져 있는 상태에서는 accept에서 에러가 발생하는게 아니라 recv()나 send()에서 발생합니다.

- 두번째의 경우
linux를 사용중이라고 하셨으니.. 제가 얘기드렸던 방법 중 strace를 사용해서 시스템콜을 보게 되면 아래와 같은 부분을 확인하실수 있습니다.

recvfrom(6, "\335\0\0\5\1\4\300\250\0&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 217, 0, NULL, NULL) = 217

sockfd 6번으로 217바이트의 데이터가 recv 되었다는 거죠...

strace의 경우 다른 시스템콜이 추가적으로 발생하면 확인하기 힘들 수도 있으니 rexos33님이 얘기하신 wireshark나 tcpdump로 확인하시는 것도 하나의 방법입니다.

확인하시면 뭔가 날라다니는 패킷이 발생하였다면 아래와 같이 표시됩니다.

16:49:13.776214 IP (tos 0x0, ttl 64, id 63901, offset 0, flags [DF], proto TCP (6), length 60) 192.168.0.aaa.port_a > 192.168.0.bbb.port_b: S, cksum 0x0517 (correct), 1199077270:1199077270(0) win 5840
0x0000: 000e 0c3c 8eae 000c 295e 3a48 0800 4500
0x0010: 003c f99d 4000 4006 bf34 c0a8 0087 c0a8
0x0020: 0012 c054 be40 4778 7796 0000 0000 a002
0x0030: 16d0 0517 0000 0204 05b4 0402 080a de7f
0x0040: 8e0b 0000 0000 0103 0307

즉, ip 192.168.0.aaa의 port_a 에서 192.168.0.bbb의 port_b로 데이터를 던졌다는거죠

blocking인지 non-blocking으로 하셨는지 모르겠지만, 만약 blocking으로 하셨다면 read 혹은 recv 에 지정해두신 length 값이 들어올때가지 대기하실수도 있습니다.

mirr187의 이미지

accept() 에서 에러가 발생하는 경우는 위의 경우외에도 몇가지가 더 있지만..

글쎄요.. socket 생성이 제대로 되고 listen() 까지 끝난 상태에서 테스트용으로 클라이언트 한두개 붙여서 accept에서 에러가 발생한 경우는 없어서.. -_-;;

지금 얘기하시는 걸로 봐서는 client가 단일일거 같습니다만.. 여러 client를 붙이신다면 다른 여러가지 에러도 발생 가능합니다..

bueline의 이미지

현재 tcpdump를 통해서 확인을 하려고 합니다.
감사합니다.

댓글 달기

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