Socket Send Buffer가 0일 때의 동작 문제?

익명 사용자의 이미지

Socket Send Buffer가 0 일 때
Send를 하고나면 Return Value가 Socket_Error로 떨어지는데,
Send후 Socket이 바로 Close되는 것 같습니다....
Recv를 하는 Client에서는 정상적으로 Data를 수신합니다.

Socket Send Buffer를 1로 설정하면
정상적으로 동작합니다....
Send Buffer가 0일 때의 현상은 왜 그런지...좀
가르쳐주셨으면 합니다...

익명 사용자의 이미지

socket의 send buffer를 0으로한다는 것은 date를 전송하지 않겠다는
강한의지죠. 당연히 공간도 할당되지 않은곳에 무언가를 집어 넣겠다는
것은 거절당하죠.
굳이 buffer size를 0으로 만들려는 이유를 모르겠군요.
buffer size가 너무 작으면 잦은 트래픽이 일어나고(그 size가 1이라면
엄청난 통신부하를 일으킬텐데...) 너무 크면 쓸데없이 메모리만 찾이
하고 전송도 느려지죠.
buffer를 clear하기위해서라면 flush를 해주면 되겠죠.
(숨기는 것이 많으면 얻는것은 적은법이랍니다...)

익명 사용자의 이미지

====================================================================
socket의 send buffer를 0으로한다는 것은 date를 전송하지 않겠다는
강한의지죠. 당연히 공간도 할당되지 않은곳에 무언가를 집어 넣겠다는
것은 거절당하죠.
====================================================================
라고 답변을 주셨는데... 질문에도 말씀드렸듯이...
Recv를 하고 있는 Client에서는 정상적으로 Data를 수신합니다.
또한 Recv한 후에 Socket_Error도 발생하지 않습니다.
하지만, Send를 하는 Server쪽에서는 Send를 정상적으로 수행한 후에
Socket_Error가 발생합니다.
즉, 송수신 완료후에 Socket_Error가 발생하는 것이지 Send 자체가
거절당하지는 않는다는 것입니다.

제 생각엔....
Socket Buffer가 할당되어 있지 않기때문에 Send시 바로 Ethernet으로
Data를 전송하지만 전송후 바로 Socket이 Close되는 것이 아닌가
생각되구요.

Recv를 하는 Client에서는 Recv Buffer를 사용하던 않하던 Data를 정상적
으로 수신한 후에 Socket Close Signal을 전송받기 때문에(순차적으로)
Client측에서는 정상적인 송수신으로 종료되는 듯합니다.

한데..왜 Send시 송신은 정상적으로 수행하고 Socket_Error가 발생하는
지가 궁금합니다.
Socket Send Buffer가 0이더라도 정상적으로 송수신이 완료되었다면,
Client측 뿐아니라 Server측에서도 정상적인 Send완료가 되어야 하는게
아닌지 의문이 됩니다.
Kernal쪽에서 Socket Buffer가 0일 때 다른 동작을 하게 되는게 아닌가
생각이 들기도 하구요....

익명 사용자의 이미지

정확하게 질문을 읽어보질 못했네요. 죄송합니다.

음... 원칙적으로 send를 할 때는 크든 적든 buffer에 값을 저장하고
보내진 데이터는 OS에 의해서(보통 buffer가 다 차든가 일정시간이
흐른 후) 전송이 이루어지게 되어 있습니다.
UNIX에서는 모든 장치를 파일 취급을 하기 때문이죠.
물론 예외는 있습니다. open(), read(), write(), close()등의 함수
입니다. 이 함수들은 시스템 버퍼를 사용하지 않고 직접 파일에 접근
을 합니다. 하지만 다른 사람들은 별로 권장을 하지 않더군요.
DOS, MS-Windows 같은 시스템에서는 유용할지 모르지만 UNIX 처럼 하
나의 시스템을 여럿이서 공유해서 사용할 경우라면 위험할지도 모르기
때문이죠.
제가 이런 이야기를 하는 이유는 buffer를 가지고 있는 이유 때문입니
다. 물론 system를 혼자만 사용한다손 치더라도 사용하고있는 OS는
다중 사용자를 기반으로 만들어진것입니다. 따라서 규정 이외의 행동에
대해서 OS가 어떻게 동작하는지는 분명하게 밝혀지지 않았죠.
(만일 밝혀졌다면 분명 버그 패치가 이루어졌겠죠.)
버퍼의 크기가 0일때의 상황은 아마 아무도 생각치 않았을 겁니다.
(버퍼도 없이 데이터를 저장한다는 것은 어패가 있으니까요.)
따라서 데이터 전송이후에 무언가 포인터를 잃고 Error를 발생한것 같
네요.
그 부분에 대해서는 아마 커널 소스를 분석해 봐야겠네요... -)

황선웅 wrote..

====================================================================
socket의 send buffer를 0으로한다는 것은 date를 전송하지 않겠다는
강한의지죠. 당연히 공간도 할당되지 않은곳에 무언가를 집어 넣겠다는
것은 거절당하죠.

====================================================================
라고 답변을 주셨는데... 질문에도 말씀드렸듯이...
Recv를 하고 있는 Client에서는 정상적으로 Data를 수신합니다.
또한 Recv한 후에 Socket_Error도 발생하지 않습니다.
하지만, Send를 하는 Server쪽에서는 Send를 정상적으로 수행한 후에
Socket_Error가 발생합니다.
즉, 송수신 완료후에 Socket_Error가 발생하는 것이지 Send 자체가
거절당하지는 않는다는 것입니다.

제 생각엔....
Socket Buffer가 할당되어 있지 않기때문에 Send시 바로 Ethernet으로
Data를 전송하지만 전송후 바로 Socket이 Close되는 것이 아닌가
생각되구요.

Recv를 하는 Client에서는 Recv Buffer를 사용하던 않하던 Data를 정상 적
으로 수신한 후에 Socket Close Signal을 전송받기 때문에(순차적으로)
Client측에서는 정상적인 송수신으로 종료되는 듯합니다.

한데..왜 Send시 송신은 정상적으로 수행하고 Socket_Error가 발생하는
지가 궁금합니다.
Socket Send Buffer가 0이더라도 정상적으로 송수신이 완료되었다면,
Client측 뿐아니라 Server측에서도 정상적인 Send완료가 되어야 하는게
아닌지 의문이 됩니다.
Kernal쪽에서 Socket Buffer가 0일 때 다른 동작을 하게 되는게 아닌가
생각이 들기도 하구요....

댓글 달기

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