소켓프로그래밍에서 접속자를 연결리스트로 저장하는 것인데요....
글쓴이: 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 {
//에러 처리
}
와 같이 수정하세요
댓글 달기