socket 프로그래밍 질문 드립니다
글쓴이: 홍지민@Naver / 작성시간: 목, 2017/08/31 - 6:04오후
서버와 클라이언트간의 간단한 메시지 송수신 소스이며 아래와 같습니다
서버(ip:218)에서 [server] 바이너리 파일 실행 후
클라이언트(ip:221)에서 [client] 바이너리 파일 실행 시 "accept () error" 라고 발생하여, perror로 확인해보니
Connection refused 에러가 발생합니다
그래서 연결상태,포트,확인 시 이상이 없었으며 서버에서 바이너리 파일 실행 중 클라이언트에서 telnet으로 (ip:218) 접근 시 작성한 메시지(hello world)가 발생합니다
어느 부분을 확인해야될지 잘 모르겠어서 질문 드립니다
* server.c *
int main() { int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; char message[]="Hello Word!\n"; /* 서버 소켓 생성 */ serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(serv_sock ==-1) error_handling("socket() error"); memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl( INADDR_ANY); serv_addr.sin_port = htons(9999); /* 소켓에 주소 할당 */ if(bind(serv_sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) error_handling("bind() error"); /* 연결 요청 대기상태로 진입 */ if(listen(serv_sock,5) == -1) error_handling("listen() error"); /* 연결 요청 수락 */ clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if(clnt_sock == -1) error_handling("accpet() error"); * client.c * <code> int main(void) { int sock; struct sockaddr_in serv_addr; char message[30]; int str_len; /* 서버 접속을 위한 소켓 생성 */ sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1) error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.0"); serv_addr.sin_port - htons(9999); /* 서버로 부터 연결 요청 */ if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) perror("무슨 에러인가요?"); // printf( "Error opening file: %s\n", strerror( errno ) ); error_handling("connect() error"); /* 데이터 수신 */ str_len = read(sock,message,sizeof(message)-1); if(str_len == -1) error_handling("accept() error"); message[str_len] = 0; printf("message from server : %s \n", message); /* 연결 종료 */ close(sock); return 0; }
Forums:
iptables, strace, tcpdump
iptables -L 을 이용하여 혹시 외부에서 접근하는 port가 차단되어 있는지 확인해보세요.
또한 strace ./client 로 실행해서 실제 어떻게 접속이 되고 있는지 확인해보시고,
다른 창에 sudo tcpdump -i eth0 혹은 sudo tcpdump -i lo 로 packet 지나가는 것을 확인해보세요.
---
http://coolengineer.com
동일 머신에서 server, clinet 실행해서 동작확인부터 해보세요
만약 동일머신에서 실행했는데 잘 동작하면, 네트워크 설정 문제일 확률이 높습니다. 프록시환경, pat, 방화벽 등.
또는 클러이언트 측에서 서버로 netcat을 이욘해서 해당 포투가 열려있는지 확인해 보새요
동일 머신에서 server, clinet 실행해서 동작확인부터 해보세요
만약 동일머신에서 실행했는데 잘 동작하면, 네트워크 설정 문제일 확률이 높습니다. 프록시환경, pat, 방화벽 등.
또는 클러이언트 측에서 서버로 netcat을 이욘해서 해당 포투가 열려있는지 확인해 보새요
컴파일러 경고는 무시하는거 아닙니다.
client.c 소스 코드에 오타가 하나 보이네요.
컴파일 경고가 나왔을텐데 무시하면 안되죠.
힌트를 드리면 포트를 설정하지 않고 접속하려 하니 오류가 나는 겁니다.
댓글 달기