네트워크 프로그래밍 아주 기본요 ㅜㅜ..
글쓴이: 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
if( serv_sock=socket(PF_INET,SOCK_STREAM,0) == -1) //소켓 생성 error_handling("socket() error"); if( setsockopt( serv_sock, SOL_SOCKET, SO_REUSEADDR, &option, optlen )) error_handling("setsockopt() error");socket 생성 뒤에 바로 setsockopt 했는데...
이제 setsockopt 에서 에러나네요 ㅜㅜ..
포트는 9000번대라서 할당 안 된것이 확실한데 그러네요 ㅜㅜ..
1%의 가능성이면 충분하다!
최선을 다하자!
포트 점유
포트를 사용하기 위하여 프로그램을 실행한후 그냥 프로그램을 종료해 버리면 이후에 다시 프로그램이 실행 될때 포트가 사용중인것을 되어 프로그램 이 에러가 나지요.
그래서
주는 옵션이
참고 하세요.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
perror 이나 strerror 로 정확한 에러 스트링을 찍어 주세요.
perror 이나 strerror 로 정확한 에러 스트링을 찍어 주세요.. 전체 코드가 없이 약간 막막한 대화가 오고 가는 군요.
---
http://coolengineer.com
pynoos님의 말처럼, 에러스트링을 찍어보고, 혹시라도, 그 메시지가
pynoos님의 말처럼, 에러스트링을 찍어보고, 혹시라도, 그 메시지가 다음과 같거나, 유사하다면,
위의 답변들을 참고하시면 되겠습니다.
아래의 코드가 제대로 된 것이라고 생각하는건 아니겠죠?[code:1]
아래의 코드가 제대로 된 것이라고 생각하는건 아니겠죠?
혹시라도 모르시겠다면 =와 ==중 어느것이 먼저 적용될것인지 조심스레 힌트를 드려봅니다. :)
덧붙여 연산자우선순위정도는 이미 알고계셨어야 한다!!라고 조심스레 핀잔해봅니다. :D
homeless
댓글 달기