select공부중인데...어디가 잘못된건가요??
글쓴이: ch0nn0m / 작성시간: 금, 2009/08/28 - 1:01오후
접속까지는 잘 되는데...메시지를 주고 받지 못하네요...
어디가 잘못된건가요??
서버
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/time.h> #include<sys/socket.h> #include<netinet/in.h> #define PORT 8888 #define BUFSIZE 128 int main(int argc, char **argv) { int serv_sock; struct sockaddr_in serv_addr; fd_set reads, temps; int fd_max; char message[BUFSIZE]; int str_len; struct timeval timeout; if(argc !=1 ) { printf("Usage : %s \n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(PORT); if(bind(serv_sock,(struct sockaddr *) &serv_addr, sizeof(serv_addr))) { printf("bind() error\n"); exit(1); } if(listen(serv_sock,5)==-1) { printf("listen() error\n"); exit(1); } FD_ZERO(&reads); FD_SET(serv_sock,&reads); fd_max=serv_sock; while(1) { int fd, str_len; int clnt_sock, clnt_len; struct sockaddr_in clnt_addr; temps=reads; timeout.tv_sec=5; timeout.tv_usec=0; if(select(fd_max+1, &temps, 0,0, &timeout)==-1) { printf("select() error\n"); exit(1); } for(fd=0; fd<fd_max+1; fd++) { if(FD_ISSET(fd,&temps)) { if(fd==serv_sock) { clnt_len=sizeof(clnt_addr); clnt_sock=accept(serv_sock,(struct sockaddr *)&clnt_addr, &clnt_len); FD_SET(clnt_sock,&reads); if(fd_max<clnt_sock) fd_max=clnt_sock; printf("클라이언트 연결 : 파일디스크립터 %d \n", clnt_sock); } else { str_len=read(fd,message,BUFSIZE); if(str_len=0) { FD_CLR(fd,&reads); close(fd); printf("클라이언트 종료 : 파일디스크립터 %d\n", fd); } else { write(fd,message, str_len); } } } } } }
클라이언트
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/types.h> #include<sys/socket.h> #define PORT 8888 #define BUFSIZE 128 int main(int argc, char **argv) { int sock; char message[BUFSIZE]; int str_len; struct sockaddr_in serv_addr; if(argc !=2) { printf("Usage : %s <IP>\n",argv[0]); exit(1); } sock=socket(PF_INET, SOCK_STREAM, 0); if(sock==-1) { printf("socket() error\n"); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=inet_addr(argv[1]); serv_addr.sin_port=htons(PORT); if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) { printf("connect() error\n"); exit(1); } while(1) { fputs("전송할 메시지를 입력하세요 (q to quit) : ", stdout); fgets(message, BUFSIZE, stdin); if(!strcmp(message, "q\n")) break; write(sock, message, strlen(message)); str_len=read(sock, message, BUFSIZE-1); message[str_len]=0; printf("서버로부터 전송된 메시지 : %s\n",message); } close(sock); return 0; }
Forums:
if(str_len=0)
if(str_len == 0) 여야...
근데 이거 책에 나온 예제 소스 맞죠?
변수명까지 눈에 익다는 ㅡㅡa
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
댓글 달기