네트워크 프로그래밍 아주 기본요 ㅜㅜ..
글쓴이: kknd345 / 작성시간: 수, 2005/01/19 - 9:45오후
몇일 전부터 배우기 시작했는데 마음대로 안 되네요.
가위 바위 보 프로그램 나름대로 짜봤는데..
bind()에서부터 막히네요.
다른 데서 오류나면 이해를 하는데... bind에서 막히니 앞이 깜깜하네요 ㅜㅜ..
왜 bind()에서 계속 오류나는 걸까요?
error_handling("bind() error"); 으로 바로 빠지네요 ㅜㅜ.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> #define BUFSIZE 20 void error_handling(char * message) { fputs(message,stderr); fputc('\n',stderr); exit(1); } char* winner(char myself[], char yourself[]) { // 가위 1 바위 2 보 3 int my, you; my=atoi(myself); you=atoi(yourself); if( my != 1 && my != 2 && my !=3) return "You wrong Input"; else if( you != 1 && you !=2 && you !=3 ) return "Other man mistakes"; if( my == you ) return "Draw"; else if( my == 1 ) { if( you == 2 ) return "You lose"; else // you == 3 return "You win"; } else if( my == 2) { if( you == 1 ) return "You win"; else return "You lose"; } else // my == 3 { if( you == 1 ) return "You lose"; else return "You win"; } } int main( int argc, char** argv) { int fd1[2], fd2[2]; //fd1 부모->자식, fd2 자식->부모 int serv_sock,clnt_sock; int clnt_addr_size,buf_size; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; char buffer1[BUFSIZE]; char buffer2[BUFSIZE]; char* check; pid_t pid; if( argc !=2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } if( serv_sock=socket(PF_INET,SOCK_STREAM,0) == -1) //소켓 생성 error_handling("socket() error"); /*************************************** Basic Option ***************************************/ clnt_addr_size=sizeof(clnt_addr); memset( &serv_addr, 0, sizeof(serv_addr)); memset( &clnt_addr, 0, sizeof(clnt_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1])); if( bind( serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) ) error_handling("bind() error"); if( listen( serv_sock, 5) == -1) error_handling("listen() error"); if( pipe(fd1) == -1 || pipe(fd2) == -1) //파이프 생성 error_handling("pipe() error"); pid = fork(); //복제 if( pid == -1) error_handling("fork() error"); else if ( pid == 0 ){ // 자식 프로세스 while(1){ close(serv_sock); if( clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size) == -1) error_handling("accept() error!"); write( clnt_sock,"1:가위 2:바위 3:보",20); buf_size=read( clnt_sock, buffer1, BUFSIZE); if( buf_size == 0){ close(clnt_sock); return 0; // 프로세스 종료 } // 종료가 아니라는 소리는 일단 입력은 들어왔다는 말이 됨. write( fd2[1], buffer1, 1 ); read( fd1[0], buffer2, 1 ); buffer1[1]='\0'; buffer2[1]='\0'; check=winner( buffer1, buffer2); write( clnt_sock, buffer1, BUFSIZE); close(clnt_sock); } } else{ // 부모 프로세스 close(clnt_sock); fputs("1:가위 2:바위 3:보",stdout); fgets(buffer1,5,stdin); write( fd1[1], buffer1, 1); read( fd2[0], buffer2, 1); buffer1[1]='\0'; buffer2[1]='\0'; check=winner( buffer1, buffer2); fputs(check,stdout); close(serv_sock); } }
Forums:
errno 찍으시고요.netstat -a로 누가 포트 점유하는지
errno 찍으시고요.
netstat -a로 누가 포트 점유하는지 확인하는거도 필요하겠네요.
Written By the Black Knight of Destruction
bind 하기전에 setsockopt 를 이용하여 SO_REUSEADDR
bind 하기전에 setsockopt 를 이용하여 SO_REUSEADDR 을 설정해주시면 되겠습니다.
---
http://coolengineer.com
[code:1] if( serv_sock=socket
socket 생성 뒤에 바로 setsockopt 했는데...
이제 setsockopt 에서 에러나네요 ㅜㅜ..
포트는 9000번대라서 할당 안 된것이 확실한데 그러네요 ㅜㅜ..
1%의 가능성이면 충분하다!
최선을 다하자!
포트 점유
포트를 사용하기 위하여 프로그램을 실행한후 그냥 프로그램을 종료해 버리면 이후에 다시 프로그램이 실행 될때 포트가 사용중인것을 되어 프로그램 이 에러가 나지요.
그래서
주는 옵션이
참고 하세요.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
perror 이나 strerror 로 정확한 에러 스트링을 찍어 주세요.
perror 이나 strerror 로 정확한 에러 스트링을 찍어 주세요.. 전체 코드가 없이 약간 막막한 대화가 오고 가는 군요.
---
http://coolengineer.com
pynoos님의 말처럼, 에러스트링을 찍어보고, 혹시라도, 그 메시지가
pynoos님의 말처럼, 에러스트링을 찍어보고, 혹시라도, 그 메시지가 다음과 같거나, 유사하다면,
위의 답변들을 참고하시면 되겠습니다.
아래의 코드가 제대로 된 것이라고 생각하는건 아니겠죠?[code:1]
아래의 코드가 제대로 된 것이라고 생각하는건 아니겠죠?
혹시라도 모르시겠다면 =와 ==중 어느것이 먼저 적용될것인지 조심스레 힌트를 드려봅니다. :)
덧붙여 연산자우선순위정도는 이미 알고계셨어야 한다!!라고 조심스레 핀잔해봅니다. :D
homeless
댓글 달기