[완료] non blocking mode에서 select()이용 send buffer 감지 하는 방법

binalee의 이미지

안녕하세요.
제목 그대로 non blocking mode에서 select()이용 send buffer 감지 하는 방법을 알고 싶습니다.
주로 select()는 패킷을 받을 때만 사용해봐서요..
현재 하는 작업이 30KB정도의 데이타를 1초에 30번씩 전송하는 것인데 SEND BUFFER에 다 쓰지 못하면 EINVAL이
리턴 되잖아요.
그때 저는 sleep()을 이용 버퍼가 비기를 기다렸다가 재전송하는 무식한 방법을 이용하고 있습니다. -_-;

지금 꽤 오랜시간 send()함수 시 blocking이 되면 처리하는 알고리즘을 찾고 있는데 select를 이용할 수 있다는
tip을 얻긴 했는데 예제가 없으니 막막하네요.

혹시 대략적인 사용법이라도 알려주시면 감사하겠습니다.

superkkt의 이미지

#include <sys/select.h>
 
int select(int nfds, fd_set *restrict readfds,
       fd_set *restrict writefds, fd_set *restrict errorfds,
       struct timeval *restrict timeout);

보시다시피 select 함수는 readfds, writefds, errorfds를 입력 받습니다. 패킷을 수신할때 select를 사용하셨다면 readfds만 셋팅하고 사용하셨겠죠. 송신할때 사용하는 방법은 writefds를 셋팅하고 select를 호출하시면 됩니다. 나머지 작업들(어떤 fd가 writable한지 확인 등)은 수신할때 사용하셨던 방법과 동일하게 하시면 됩니다.

단, select가 writable이라고 리턴했다고해서 프로그래머가 요청하는 전송량을 모두 전송 할 수 있는것은 아닙니다. 예를들어, 소켓의 send buffer가 2048 바이트의 사용가능한 공간이 있어서 select가 writable로 리턴했는데 프로그래머 8192 바이트를 write하면 블럭되는거죠. 그래서 non-blocking mode와 함께 select를 사용해야 합니다.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

binalee의 이미지

사용 가능한 사이즈는 알수가 없는 거군요..
정말 궁금했는데 답변 주셔서 감사합니다.
좋은 하루 되세요...

감사합니다

sunyzero의 이미지

1:1 통신인 경우라면, 굳이 nonblocking socket과 select()를 사용하지 않아도,
그냥 blocking mode에서 setsockopt()함수의 SO_SNDTIMEO 옵션으로 타임아웃을 지정하면,
타임아웃에 걸리면 EAGAIN 에러로 리턴해줍니다. 간단하게 작성할거면 이게 더 편리합니다.

만일 1:n 의 통신이라면 어쩔 수 없이 nonblocking, select(), buffer queue까지 구현해야 합니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

댓글 달기

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