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;
}
多进程:
#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;
}
相关文章推荐
- 小心服务器内存居高不下的元凶--WebAPI服务
- Python3写爬虫(四)多线程实现数据爬取
- 运维入门
- Linux5.9无人值守安装
- 数据中心和云未来的十二大趋势
- 用vsftp快速搭建ftp服务器
- Linux快速构建apache web服务器
- 服务器监控策略浅谈
- 如何降低服务器采购成本 原理分析
- 建议的服务器分区办法
- 服务器托管六大优势分析
- Erlang实现的一个Web服务器代码实例
- 服务器技术全面解析
- C#实现多线程的同步方法实例分析
- 保护DNS服务器的几点方法小结
- 我国成为全球第二大服务器消费国
- 服务器 安全检查要点[星外提供]
- 服务器应用自动重新启动IIS批处理[原创]_DOS/BAT_脚本之家
- FTP 服务器关于权限的问题