[질문] 소켓으로 짠 Client/Server프로그램을 테스트하는데 로컬테스트와 리모트테스트의 차이..

tyolee83의 이미지

소켓으로 통신하는 Client와 Server를 만들었습니다.

프로토콜을 설계해서 주고받고, 파일 정보를 전송한 후 파일을 전송하는 동작을 합니다.

문제는 다음과 같습니다.

개발 컴퓨터에서 127.0.0.1로 client/server를 동작시키면 정상적으로 잘 동작합니다.

이제 같은 프로그램을 실제 물리적으로 다른 컴퓨터에서 동작시키면

소켓 에러가 납니다. (연결이 안되는 것이 아니라 한참 통신하다가 죽어버립니다.)

죽는 상황은,

client가 server에게 파일 정보를 달라고 요청합니다.

그러면 server는 일단 파일이 몇개 전송될 것인지 client에게 정보를 알려줍니다.

client는 파일 개수만큼 루프를 돌면서 각각의 파일 정보를 recv로 기다립니다.

server는 각 파일 정보를 프로토콜 정의대로 만들어서 전송해 줍니다.

이 동작이 로컬 테스트에서는 잘 되는데,

물리적으로 다른 컴퓨터로 테스트하면, 파일 정보를 모두 전송하고 나서

서버가 새로운 응답을 기다리는 부분까지 갔다가, 10054번 소켓 에러를 내버립니다.

찾아보니까 10054는 상대방의 연결이 끊어졌다는 에러인데,

로컬에서는 잘 되다가 리모트 환경에서 안되니 에러 찾기가 너무 힘드네요...

혹시 이런 경험 있으신 분들 조언 부탁 드립니다.

미리 감사드립니다.

pokev25의 이미지

로컬에서 잘되는데

실제 필드테스트하니 안되는건 보통 설계가 잘못된겁니다.

양쪽에서 디버그 찍어보면서 왜 끊어지는지 확인해봐야 할것 같네요

소켓을 뭘로 사용했는지도 필요할듯 하구요

tyolee83의 이미지

질문자입니다.

파일 개수가 적을때는 리모트끼리도 정상작동 하는걸 확인하고서는,

혹시 요청을 받는 쪽이 네트워크 부하로 뻗는건 아닌가 의심하게 되었습니다.

실제로 프로토콜에 ACK 없이 정보를 계속 요청하게 되어 있어서요...

그래서 send 중간중간 sleep을 조금씩 하게 해 줬더니

끊어지지 않고 정상 작동 하네요...

뭐 다른 문제(DB 접근하다가 뻗어버리는;;)가 있지만,

일단 소켓에서는 ACK가 필요하다는 것을 알게 되었습니다.

프로토콜 설계할때 ACK를 귀찮아서 안넣었는데, 큰 작업 하게 생겼네요 ㅠㅠ

고수님들, 제가 제대로된 교훈을 얻은 거 맞나요 :)

관심 감사드립니다.

//TODO

mirr187의 이미지

linux 라면 strace, bsd계열이면 truss 로 실제 프로세스가 어떤 상태로 바뀌고 난 다음에 해당 에러가 발생하는지 알아야 원인을 명확하게 찾을 수 있을거 같네요..
windows라면... 다른분이.. 쿨럭..;;

위의 tool등을 이용해서 시그널이 발생하는 부분을 파악해야 원인을 알 수 있을거 같습니다만..

pokev25님의 말처럼 소켓의 종류에 따라서도 원인이 달라질 수 있습니다..

댓글 달기

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