您的位置:首页 > 理论基础 > 计算机网络

TCP服务器多线程 多进程简单测试

2015-08-20 19:51 656 查看
服务器一般都要求可以同时处理 多个客户的数据请求,利用进程和线程可以实现服务器监听和处理的分离,实现同时处理多个客户端的连接请求,

多进程:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
//#include<pthread.h>
#include<errno.h>

int main()
{
int fd = socket(AF_INET,SOCK_STREAM,0);
printf("socket id = %d\n",fd);

struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(7777);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

int err = bind(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
if(err < 0)
{
fprintf(stderr,"bind error:%s\n",strerror(err));
return -1;
}

listen(fd,5);
int newfd;
struct sockaddr_in peer;
socklen_t size;
size = sizeof(peer);
while(1)
{
printf("waiting for cilent connectting...\n");
newfd = accept(fd,(struct sockaddr *)&peer,&size);
printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
int pid = fork();
if(pid == 0)
{
char buff[100];
int cnt;
while(1)
{
fprintf(stdout,"pid:%u\n",getpid());
cnt = read(newfd,buff,100);
write(1,buff,cnt);
buff[cnt] = '\0';
if(strncmp(buff,"quit",4)==0)
break;

}
close(newfd);

}
}

close(fd);
return 0;
}


多线程:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>

void *thread_fun(void *arg)
{
int newfd = (int)arg;
char buff[100];
int cnt;
while(1)
{
fprintf(stdout,"thread:%u\n",pthread_self());
cnt = read(newfd,buff,100);
write(1,buff,cnt);
buff[cnt] = '\0';
if(strncmp(buff,"quit",4)==0)
break;

}
close(newfd);
}

int main()
{
int fd = socket(AF_INET,SOCK_STREAM,0);
printf("socket id = %d\n",fd);

struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(7777);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

int err = bind(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
if(err < 0)
{
fprintf(stderr,"bind error:%s\n",strerror(err));
return -1;
}

while(1){
listen(fd,5);
int newfd;
struct sockaddr_in peer;
socklen_t size;
size = sizeof(peer);
while(1)
{
printf("waiting for cilent connectting...\n");
newfd = accept(fd,(struct sockaddr *)&peer,&size);
printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
pthread_t tid;
pthread_create(&tid,NULL,thread_fun,(void *)newfd);
}
}
close(fd);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp 多线程 服务器