소켓프로그래밍인데요 왜 bind 에러가 날까요?

jamongx의 이미지

정상적으로 연결을 끊고 종료가 되는것 같은데

bind에러가 나서 프로그램을 실행시킬때마다 포트 번호를

바꿔가면서 실행시키고 있습니다.

어떤 때는 같은 포트를 사용해도 연결 잘되더만은 ㅡㅡ;

프로그래밍 상에서 포트를 릴리즈해주어야 합니까?

아니면 흔한 실수를 제가 저지르고 있는지 궁금하네요

그럼 답변 부탁드립니다.

불량청년의 이미지

바인드를 왜 할까요?

맞습니다. 바인드를 하면, 패시브맵(로컬 프로토콜, 로컬 IP주소, 로컬포트)이

생성됩니다.

요것을 맵핑이라고 부르기도 하더군요.

그런데, 커널은 이 자료구조를 프로그램이 종료해도

메모리에서 해제를 곧바로 안하는 걸로 알고 있습니다.

스케쥴링 정책에 의해서 일정텀이 지나야 해제를 하는데 그 전에 님이

재실행을 시켜서 바인드 에러가 나는것이 아닐까 하네요.

즉, 연결 종료가 정상적으로 일어나도 상대방의 TCP버퍼가 완전히

비워진다는 보장이 없는것과 같다고 생각되네요.

틀린점이 있다면 지적해 주시면 감사하겠습니다.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

kukuman의 이미지

Quote:
NAME
getsockopt, setsockopt - get and set options on sockets

SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>

int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

위의 함수에서 level은 "SOL_SOCKET"으로 optname은 "SO_REUSEADDR"로 세팅해주시면 해당 에러는 더이상 나지 않게 됩니다~

아,,, 함수 두 개 중, setsockopt 함수를 사용하셔야 합니다~ :o
getsockopt는 세팅되어 있는 옵션들을 가져오는 함수입니다~

Be at a right place at a right time...

jamongx의 이미지

딴에는 해결을 했는데요

파일을 보내기 위해서

fp = fopen("list.txt", "r");

소켓을 종료하기 전에

fclose(fp) 이것을 빼먹었네요..

이걸 추가해주고

소켓을 종료하니 포트를 다시 사용할수 있습니다. 헐 ~

용모수려 재색겸비

mach의 이미지

사용하고 있는 서버 프로그램의 포트번호가 예를들어 9999라면,

Quote:
netstat -na | grep 9999

라고 쳐서 현재 해당 포트에 대한 해당 소켓의 상태(state)를 알아보기 바랍니다.
다음으로 해당 상태에 대한 이해(질문 또는 검색)를 하시고, 이럴 경우 어떻게
하는가?를 알아보세요. 그리고, 그 해결책을 질문하시면됩니다.
문제에 직면하면 답을 아는것 보다, 풀어가는 방법도 같이 알아야 합니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ifyou의 이미지

jamongx wrote:
딴에는 해결을 했는데요

파일을 보내기 위해서

fp = fopen("list.txt", "r");

소켓을 종료하기 전에

fclose(fp) 이것을 빼먹었네요..

이걸 추가해주고

소켓을 종료하니 포트를 다시 사용할수 있습니다. 헐 ~

이상하네요. bind 오류랑 fclose()랑 별 상관이 없어 보이는데..

tacstar님, kukuman님께서 원인과 해결책을 제시해 주셨고,

mach님께서 아주 좋은 답변을 달아주셨습니다.

우선, 이곳 게시판에서 binding과 관련된 글을 좀 읽어 보시면

부가적으로 많은 것들을 얻으실수 있을 것 같습니다 :D

.

kdoll의 이미지

스티븐슨의 Unix Network pro.... 2th vol1에 194페이지 (번역)

잘나와 있어요..

자료구조가 해제가 않되는 것이 아니겠죠... 그럼 치명적 이니까요..

댓글 달기

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