#define NUM 1024
struct userdata {
char ip[32];
int connfd;
//char buf[NUM];
};
void *pthread_fun1(void *arg)
{
int connectfd = ((struct userdata *)arg)->connfd;
char ip_user[32] ;
strcpy(ip_user,((struct userdata *)arg)->ip);
printf("connectfd:%d\n",connectfd);
char buf[NUM]= {0};
while(1){
int ret = read(connectfd,buf,NUM);
if ( ret == 0 ){
printf("quit\n");
close(connectfd);
break;
}
printf("ip:%s\n",ip_user);
puts(buf);
strcat(buf," ");
strcat(buf,ip_user);
strcat(buf,"\0");
write(connectfd,buf,strlen(buf));
memset(buf,0,NUM);
}
return (void *)0;
}
int main(int argc,char *argv[])
{
//AF_INET:ipv4
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0){
perror("socket");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(9999);
seraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
if (-1 == bind(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr))){
perror("bind");
return -1;
}
printf("--bind--\n");
if(-1 == listen(sockfd,5)){
perror("listen");
return -1;
}
printf("--listen--\n");
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
int connectfd ;
while(1){
if((connectfd = accept(sockfd, (struct sockaddr*)&cliaddr,&len)) < 0){
perror("accept");
return -1;
}
printf("ip:%s,port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
printf("--accept--\n");
/*
while(1){
char buf[NUM]={0};
if ( -1 == read(connectfd,buf,NUM)){
perror("read");
return -1;
}
if ( strcmp(buf,"quit") == 0 ){
fprintf(stderr,"exit!");
break;
}
puts(buf);
}
*/
struct userdata *data;
data = (struct userdata *)malloc(sizeof(struct userdata));
strcpy(data->ip,inet_ntoa(cliaddr.sin_addr));
data->connfd = connectfd;
pthread_t tid;
if( 0 != pthread_create(&tid,NULL,pthread_fun1,(void *)data)){
perror("pthread_create");
break;
}
if( pthread_detach(tid) != 0){
perror("pthread_detach");
break;
}
}
close(connectfd);
close(sockfd);
return 0;
}
测试代码:多线程服务器
最新推荐文章于 2024-12-21 16:36:34 发布