소켓프로그래밍에서 접속자를 연결리스트로 저장하는 것인데요....
글쓴이: ch0nn0m / 작성시간: 월, 2009/08/24 - 12:10오후
클라이언트가 서버에 접속할때 이름을 넣고...그 이름이 서버에 연결리스트로 저장되게 만들어보고 있었는데요...
클라이언트에서 전송할때는 문제없이 맞게 전송되는거 같은데...
서버에서 받을때는 이상하게 받네요...?
어디가 잘못된건지...부탁드립니다
서버
#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 typedef struct _user { char name[20]; struct _user *next; }user; user *head, *tail; void init(void) { head=(user*)malloc(sizeof(user)); tail=(user*)malloc(sizeof(user)); head->next=tail; tail->next=tail; } void add_user(char *str)//사용자저장 { int i; user *t; t=(user*)malloc(sizeof(user)); str[strlen(str)]=0; printf("str=%s\n", str); sprintf(t->name,"%s",str); t->next=head->next; head->next=t; } void print() { user *p; p=head->next; while(p!=tail) { printf("%s\n",p->name); p=p->next; } } int main(int argc, char **argv) { init(); char name[20]; int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_size; pthread_t thread; if(argc!=2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_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=htonl(INADDR_ANY); serv_addr.sin_port=htons(PORT); if(bind(serv_sock,(struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1) { printf("bind() error\n"); exit(1); } if(listen(serv_sock, 5)==-1) { printf("listen() error\n"); exit(1); } while(1){ clnt_size=sizeof(clnt_addr); clnt_sock=accept(serv_sock,(struct sockaddr*) &clnt_addr,&clnt_size); if(clnt_sock==-1) { printf("accept() error\n"); exit(1); } read(clnt_sock,name,sizeof(name)); printf("%s\n",name); //클라이언트가 보낸 문장출력해서 확인하게 위한 코드 printf("%d\n",strlen(name)); //클라이언트가 보낸 문장길이 확인하기 위한 코드 printf("%s 님이 접속 하셨습니다...\n",name); add_user(name); //접속자 추가 print(); //접속자 출력 printf("새로운 연결 클라이언트 ip: %s\n",inet_ntoa(clnt_addr.sin_addr)); } return 0; }
클라이언트
#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 char name[20]; char message[512]; int main(int argc,char **argv) { int sock; int str_len; struct sockaddr_in serv_addr; if(argc !=4 ){ printf("Usage : %s <IP> <port> <name>\n", argv[0]); exit(1); } sprintf(name, "[%s]", argv[3]); 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); } write(sock,name,strlen(name)); printf("%s\n",name); //클라이언트에서 보내는 문장 출력하는 코드 printf("%d\n",strlen(name)); //클라이언트에서 보내는 문장길이 출력하는 코드 close(sock); return 0; }
결과가...
서버는...
[ch0nn0m@localhost tmp]$ ./test 8888
[YOYO]??
15
[YOYO]?? 님이 접속 하셨습니다...
-----접속자-----
[YOYO]??
----------------
새로운 연결 클라이언트 ip: 127.0.0.1
클라이언트는...
[ch0nn0m@localhost tmp]$ ./testc 127.0.0.1 8888 YOYO
[YOYO]
6
어디가 잘못된건가요???
Forums:
제 컴퓨터에선
제 컴퓨터에선 문제없이 잘 돌아가네요.
한가지 의심이 가는 게 있는데.. name 을 0 으로 한 번 초기화 해 보세요.
---
Emerging the World!
Emerging the World!
read 부분을 수정
int read_len = read(clnt_sock,name,sizeof(name)-1);
if (read_len > 0) name[read_len] = 0;
else {
//에러 처리
}
와 같이 수정하세요
댓글 달기