Linux网络编程之高级并发服务器Word格式.docx

上传人:b****6 文档编号:21257404 上传时间:2023-01-28 格式:DOCX 页数:11 大小:17.22KB
下载 相关 举报
Linux网络编程之高级并发服务器Word格式.docx_第1页
第1页 / 共11页
Linux网络编程之高级并发服务器Word格式.docx_第2页
第2页 / 共11页
Linux网络编程之高级并发服务器Word格式.docx_第3页
第3页 / 共11页
Linux网络编程之高级并发服务器Word格式.docx_第4页
第4页 / 共11页
Linux网络编程之高级并发服务器Word格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Linux网络编程之高级并发服务器Word格式.docx

《Linux网络编程之高级并发服务器Word格式.docx》由会员分享,可在线阅读,更多相关《Linux网络编程之高级并发服务器Word格式.docx(11页珍藏版)》请在冰豆网上搜索。

Linux网络编程之高级并发服务器Word格式.docx

recv(...);

process(...);

send(...);

//关闭客户端

(2)统一accept,多线程

pthread_create(....);

//关闭服务器

线程1:

recv(....);

process(....);

(3)accept放入每个线程

socket(...);

bind(...);

listen(...);

pthread_create(...);

pthread_join(...);

//等待线程结束

Mutex_lock//互斥锁

accept(...);

Mutex_unlock(...);

//客户端

3.相关例子

TCP服务器:

(1)统一accept多进程

服务器;

#include<

stdio.h>

string.h>

stdlib.h>

sys/socket.h>

sys/types.h>

netinet/in.h>

time.h>

/**

高级并发服务器

TCP统一accept

当有客户端到来时,为每个客户端建立进程,然后每个进程处理客户端的请求,动态的建立进程

**/

#definePORT8888

#defineBUFFERSIZE1024

#defineBACKLOG2

staticvoidhandle(intsc){//处理客户端的请求

charbuffer[BUFFERSIZE];

time_tnow;

intsize;

memset(buffer,0,BUFFERSIZE);

size=recv(sc,buffer,BUFFERSIZE,0);

if(size>

0&

&

!

strncmp(buffer,"

TIME"

4)){//时间服务器,当客户端请求时间就把时间发送给客户端

now=time(NULL);

sprintf(buffer,"

%24s\r\n"

ctime(&

now));

send(sc,buffer,strlen(buffer),0);

close(sc);

intmain(intargc,char*argv[]){

intret;

ints;

intsc;

//用于服务器与客户端进行数据传输的套接字

structsockaddr_inserver_addr;

structsockaddr_inclient_addr;

intlen;

len=sizeof(client_addr);

//建立流式套接字

s=socket(AF_INET,SOCK_STREAM,0);

if(s<

0){

perror("

socketerror"

);

return-1;

}

//将地址结构绑定到套接字描述符上去

memset(&

server_addr,0,sizeof(server_addr));

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(PORT);

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

ret=bind(s,(structsockaddr*)&

server_addr,sizeof(server_addr));

if(ret==-1){

binderror"

ret=listen(s,BACKLOG);

if(ret<

listenerror"

while

(1){

sc=accept(s,(structsockaddr*)&

client_addr,&

len);

if(sc<

continue;

if(fork()==0){//子进程

handle(sc);

close(s);

//子进程关闭用于监听的套接字

}else{

close(sc);

//父进程关闭客户端套接字

客户端:

ints;

intret;

intsize;

structsockaddr_inserver_addr;

charbuffer[BUFFERSIZE];

s=socket(AF_INET,SOCK_STREAM,0);

if(s<

bzero(&

//将地址结构绑定到套接字

//连接服务器

ret=connect(s,(structsockaddr*)&

connecterror"

memset(buffer,0,BUFFERSIZE);

strcpy(buffer,"

size=send(s,buffer,strlen(buffer),0);

if(size<

senderror"

size=recv(s,buffer,BUFFERSIZE,0);

recverror"

return;

printf("

%s"

buffer);

close(s);

return0;

(2)统一accept多线程

服务器:

TCP并发服务器,采用多线程,每次客户端发送请求,主线程建立一个子线程,用于处理客户端的请求

线程具有速度快,占用资源少,数据可以共享等优点统一accept

staticvoidhandle(void*sc1){

intsc;

time_tnow;

sc=*((int*)sc1);

//转换成int指针,然后取值,sc1本身就是一个指针

size=recv(sc,buffer,BUFFERSIZE,0);

if(size>

4)){//请求服务器的时间

//清0

//向客户端发送数据

pthread_tthread1;

//定义线程名

structsockaddr_inserver_addr,client_addr;

//将服务器端的地址结构绑定到套接字描述符

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(PORT);

ret=bind(s,(structsockaddr*)&

server_addr,sizeof(structsockaddr_in));

if(ret<

//监听

ret=listen(s,BACKLOG);

//接收客户端的请求

for(;

;

){

}else{

pthread_create(&

thread1,NULL,handle,(void*)&

sc);

//建立线程,让线程去处理,最后一个字段是传递给线程处理函数handle的参数

(3)单独线程accept

pthread.h>

多线程TCP并发服务器

主线程创建多个线程,然后每个线程独立的accept和进行数据的发送与接收

多线程,独立accept

#defineCLIENTNUM3

staticvoid*handle(void*s1){

intlen;

pthread_mutex_talock=PTHREAD_MUTEX_INITIALIZER;

structsockaddr_inclient_addr;

s=*((int*)s1);

//得到服务器端的套接字描述符

//等待客户端连接

len=sizeof(client_addr);

){//不停的循环等待客户端的连接

//进入互斥区,每次一个线程处理客户端

pthread_mutex_lock(&

alock);

sc=accept(s,(structsockaddr*)&

pthread_mutex_unlock(&

4)){

}

inti;

pthread_tthread[CLIENTNUM];

//将地址结构绑定到套接字上

if(ret==-1){

//建立3个线程,每个线程独立的accept

for(i=0;

i<

CLIENTNUM;

i++){

thread[i],NULL,handle,(void*)&

s);

//线程的处理函数为handle,传递的参数为套接字描述符s 

 

//while

(1);

for(i=0;

pthread_join(thread[i],NULL);

//关闭套接字

总结:

统一accept,多进程服务器是对简单并发服务器的改进,而由于进程的切换开销比较大,所以又有了统一accept,多线程的并发服务器。

而单独线程的accept是完全用线程来处理请求。

这些都是TCP服务器,由于UDP是突发的数据流,没有三次握手,所以服务器不能检测到客户端什么时候发送数据。

以上三种高级并发服务器仍然存在着性能问题,下一节介绍的I/O复用的循环服务器是对这三种高级并发服务器的改进。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1