测试代码:多线程服务器

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值