정상적으로 연결을 끊고 종료가 되는것 같은데
bind에러가 나서 프로그램을 실행시킬때마다 포트 번호를
바꿔가면서 실행시키고 있습니다.
어떤 때는 같은 포트를 사용해도 연결 잘되더만은 ㅡㅡ;
프로그래밍 상에서 포트를 릴리즈해주어야 합니까?
아니면 흔한 실수를 제가 저지르고 있는지 궁금하네요
그럼 답변 부탁드립니다.
바인드를 왜 할까요?
맞습니다. 바인드를 하면, 패시브맵(로컬 프로토콜, 로컬 IP주소, 로컬포트)이
생성됩니다.
요것을 맵핑이라고 부르기도 하더군요.
그런데, 커널은 이 자료구조를 프로그램이 종료해도
메모리에서 해제를 곧바로 안하는 걸로 알고 있습니다.
스케쥴링 정책에 의해서 일정텀이 지나야 해제를 하는데 그 전에 님이
재실행을 시켜서 바인드 에러가 나는것이 아닐까 하네요.
즉, 연결 종료가 정상적으로 일어나도 상대방의 TCP버퍼가 완전히
비워진다는 보장이 없는것과 같다고 생각되네요.
틀린점이 있다면 지적해 주시면 감사하겠습니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
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);
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...
딴에는 해결을 했는데요
파일을 보내기 위해서
fp = fopen("list.txt", "r");
소켓을 종료하기 전에
fclose(fp) 이것을 빼먹었네요..
이걸 추가해주고
소켓을 종료하니 포트를 다시 사용할수 있습니다. 헐 ~
용모수려 재색겸비
사용하고 있는 서버 프로그램의 포트번호가 예를들어 9999라면,
netstat -na | grep 9999
------------------ P.S. -------------- 지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
딴에는 해결을 했는데요 파일을 보내기 위해서 fp = fopen("list.txt", "r"); 소켓을 종료하기 전에 fclose(fp) 이것을 빼먹었네요.. 이걸 추가해주고 소켓을 종료하니 포트를 다시 사용할수 있습니다. 헐 ~
이상하네요. bind 오류랑 fclose()랑 별 상관이 없어 보이는데..
tacstar님, kukuman님께서 원인과 해결책을 제시해 주셨고,
mach님께서 아주 좋은 답변을 달아주셨습니다.
우선, 이곳 게시판에서 binding과 관련된 글을 좀 읽어 보시면
부가적으로 많은 것들을 얻으실수 있을 것 같습니다 :D
.
스티븐슨의 Unix Network pro.... 2th vol1에 194페이지 (번역)
잘나와 있어요..
자료구조가 해제가 않되는 것이 아니겠죠... 그럼 치명적 이니까요..
텍스트 포맷에 대한 자세한 정보
<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]
바인드...
바인드를 왜 할까요?
맞습니다. 바인드를 하면, 패시브맵(로컬 프로토콜, 로컬 IP주소, 로컬포트)이
생성됩니다.
요것을 맵핑이라고 부르기도 하더군요.
그런데, 커널은 이 자료구조를 프로그램이 종료해도
메모리에서 해제를 곧바로 안하는 걸로 알고 있습니다.
스케쥴링 정책에 의해서 일정텀이 지나야 해제를 하는데 그 전에 님이
재실행을 시켜서 바인드 에러가 나는것이 아닐까 하네요.
즉, 연결 종료가 정상적으로 일어나도 상대방의 TCP버퍼가 완전히
비워진다는 보장이 없는것과 같다고 생각되네요.
틀린점이 있다면 지적해 주시면 감사하겠습니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
소켓에서 port를 다시 사용할 수 있도록 세팅해주셔야 합니다~
위의 함수에서 level은 "SOL_SOCKET"으로 optname은 "SO_REUSEADDR"로 세팅해주시면 해당 에러는 더이상 나지 않게 됩니다~
아,,, 함수 두 개 중, setsockopt 함수를 사용하셔야 합니다~ :o
getsockopt는 세팅되어 있는 옵션들을 가져오는 함수입니다~
Be at a right place at a right time...
답변 감사드립니다.
딴에는 해결을 했는데요
파일을 보내기 위해서
fp = fopen("list.txt", "r");
소켓을 종료하기 전에
fclose(fp) 이것을 빼먹었네요..
이걸 추가해주고
소켓을 종료하니 포트를 다시 사용할수 있습니다. 헐 ~
용모수려 재색겸비
사용하고 있는 서버 프로그램의 포트번호가 예를들어 9999라면,[qu
사용하고 있는 서버 프로그램의 포트번호가 예를들어 9999라면,
라고 쳐서 현재 해당 포트에 대한 해당 소켓의 상태(state)를 알아보기 바랍니다.
다음으로 해당 상태에 대한 이해(질문 또는 검색)를 하시고, 이럴 경우 어떻게
하는가?를 알아보세요. 그리고, 그 해결책을 질문하시면됩니다.
문제에 직면하면 답을 아는것 보다, 풀어가는 방법도 같이 알아야 합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
Re: 답변 감사드립니다.
이상하네요. bind 오류랑 fclose()랑 별 상관이 없어 보이는데..
tacstar님, kukuman님께서 원인과 해결책을 제시해 주셨고,
mach님께서 아주 좋은 답변을 달아주셨습니다.
우선, 이곳 게시판에서 binding과 관련된 글을 좀 읽어 보시면
부가적으로 많은 것들을 얻으실수 있을 것 같습니다 :D
.
스티븐슨의 Unix Network pro.... 2th vol1에 194
스티븐슨의 Unix Network pro.... 2th vol1에 194페이지 (번역)
잘나와 있어요..
자료구조가 해제가 않되는 것이 아니겠죠... 그럼 치명적 이니까요..
댓글 달기