용량이 큰 파일을 전송하는 소켓 작성

cjy1126의 이미지

선배의 소개로 3개월간 아르바이트를 하고있습니다.

영상처리, 시리얼통신, db 등 할것이 많지만, 지금 하는것은 tcp를 이용하여 영상처리 데이터를 전송하는 네트웍 프로그램을 만드는 것입니다.

윈도우의 WSAAyncSelect를 이용하여 프로그램을 작성하였는데, 여기서 질문하는것은 그것을 제외하면 bsd 소켓을 사용해서 만들었으니 차이가 없을거란 생각에서입니다.(물론 데브피아에도 소스 올리고 질문했으나 답변이 ㅡ.ㅜ)

클라이언트에서 연결을 누르면 서버에서 데이터를 보내는데, 그 사이즈가 (640*480*3)입니다. 이 데이터를 0.2초마다 보냅니다.

현재의 문제점은 프로그램이 됐다 안됐다 하는것입니다.

서버에서는 데이터를 640*480*3만큼 한번보내고, 그 다음부터는 WSAEWOULDBLOCK 에러가 발생합니다.

클라이언트는 한번의 FD_READ 이벤트도 발생하지 않습니다.

netstat -na를 쳐보면, 둘다 연결상태입니다.

서버는 데이터를 보내는데, 클라이언트가 read를 안해서 서버의 송신버퍼가 풀나는것 같습니다.(어떻게 처리를해야할지, 확인해야할지 모르겠습니다.)

send 함수를 사용할때, 데이터 전송사이즈를 640*480*3만큼 보냅니다.

일단 프로그램의 전송이 한번 제대로되면, 하루종일 켜놔도 잘됩니다.

cpu점유율이나, 메모리 등의 리소스가 하루후에도 모두 일정합니다.

고수님들의 도움을 부탁드립니다.

최종호의 이미지

보통의 경우에는 Nagle 알고리즘, delayed ACK, 버퍼 사이즈가
짬뽕되어서 전송지연이 나타나는 것이 일반적인 증상인데,
이벤트가 한번도 발생안된다는 것은 무언가 좀 이상합니다.

스니퍼나 이서리얼 걸어서 패킷 오가는 것을 분석해 보세요.
어디까지 진행되다가 멈추는지 파악한 다음에 차분하게 분석해 보는것이 좋을 듯 한데요.

fox9의 이미지

cjy1126 wrote:
서버에서는 데이터를 640*480*3만큼 한번보내고, 그 다음부터는 WSAEWOULDBLOCK 에러가 발생합니다.

WSAEWOULDBLOCK 에러가 발생하면 그냥 다시 보내시면 됩니다.
에러지만 에러가 아니라고 봐도 무방할듯..

MSDN에서 인용해보면

This error is returned from operations on non-blocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a non-fatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a non-blocking SOCK_STREAM socket, since some time must elapse for the connection to be established. 위 내용 중간에 잘 보시면.. It is a non-fatal error, and the operation should be retried later 라고 되어있지요 8)

cjy1126의 이미지

서버에서 클라이언트에게 900k정도의 데이터를 보냈는데, 클라이언트에서 recv를 안해서(FD_READ가 발생하지않으니까요 ㅡ.ㅜ) 서버의 송신버퍼의 데이터를 못버리는것 같습니다.

결국 서버의 송신버퍼는 풀상태가되고, 타이머에의해 0.2초마다 send를하니 0.2초마다 send는 -1의값인 에러를 보내네요.(WSAGetLastError()을해보면 WSAEWOULDBLOCK가 나오고요.)

즉, 클라이언트가 첫번째 패킷을 받냐 못받냐가 관건인데, tcp에서 이런 일이 생긴다는게 ㅡㅡ;;;

첫번째 패킷을 잘받으면 그 다음부터는 순조롭거든요.(하루종일 켜놔도 걱정이 없죠.)

밑에분 말씀대로 다시보내면 되지만, 클라이언트에서 FD_READ가 발생하지 않으니, 결국은 계속 WSAEWOULDBLOCK만 걸리네요.

차라리 아예 안되면 속편할텐데... 됐다 안됐다하니 답답하네요.

지금 소스 수정중이라서 주석달고하면 소스도 올려서 질문할려고요.

5개의 클래스로 만들어서, 소스만 올리고 그냥 묻기에는 죄송하네요. ㅡㅡ;;;

답변해주셔서 감사드립니다.

댓글 달기

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