소켓 프로그래밍 중 한번밖에는 실행이 안됩니다.
글쓴이: ckebabo / 작성시간: 토, 2005/04/02 - 5:22오후
server.c
#include "app.h" int main() { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; /* 소켓생성, 명명 */ server_sockfd = NEW_SOCKET; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(APP_PORT); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address, server_len); listen(server_sockfd, 10); while(1) { char ch; client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_sockfd, &client_len); read(client_sockfd, &ch, 1); ch++; write(client_sockfd, &ch, 1); close(client_sockfd); } close(server_sockfd); return 0; }
client.c
#include "app.h" int main() { int sockfd; int len; struct sockaddr_in address; int result; char ch = 'A'; /* 소켓 생성, 명명 */ sockfd = NEW_SOCKET; address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_port = htons(APP_PORT); len = sizeof(address); result = connect(sockfd, (struct sockaddr *)&address, len); if(result == -1) { perror("Error: can't connect server!\n"); exit(1); } write(sockfd, &ch, 1); read(sockfd, &ch, 1); printf("char from server = %c\n", ch); close(sockfd); return 0; }
컴파일해서 실행을 하면 처음 한번은 제대로 실행이 됩니다. 그런데 다시 한번 실행을 하면은 클라이언트가 서버에 접속을 할 수가 없습니다.
netstat를 해서 보면
Quote:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost.localdom:3000 localhost.localdo:32837 TIME_WAIT
이렇게 나오는데요. 또 서버를 강제로 종료시키고 조금 있다가 다시 실행해보면 또 한번은 되고, 두번째부터는 되질 않습니다.
무엇이 문제인지 잘 모르겠습니다.
Forums:
소켓 옵션으로 SO_REUSEADDR을 지정해주세요. (setsockop
소켓 옵션으로 SO_REUSEADDR을 지정해주세요. (setsockopt())
TCP TIME_WAIT 상태로 들어가는건 정상적인 동작입니다.
네트워크 프로그램을 한다면 스티븐 아저씨의 유닉스 네트워킹 프로그래밍을 한번 독파해보시는게 좋습니다. 바이블입니다. :)
Socket을 nonblocking Mode로 하세요
소켓을 nonblocking 모드로 하세요
그리고 소스가 아직 많이 부족하네요 좀더 ... ...
fullmoonkim
댓글 달기