소켓 프로그래밍 중 한번밖에는 실행이 안됩니다.
글쓴이: 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
댓글 달기