您的位置:首页 > 运维架构 > Linux

Linux-6.5-服务器模型

2015-07-18 18:24 423 查看
(1)服务器模型:



(2)UDP:



UDP循环服务器:

当一个UDP客户端占用UDP服务器时,另外的UDP客户端还可以向UDP服务器发送信息.

因为UDP服务不需要建立连接

UDP循环服务器代码请看 Linux-6.4-UDP章.

(3)TCP:





TCP循环服务器代码请看Linux-6.3-TCP章.

TCP并发服务器设计:



TCP并发服务器代码:

tcp_server_fork.c



#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <errno.h>

#include <netdb.h>

#include <string.h>

#define portnumber 3333

int main(int argc,char *argv[])

{

int listen_fd,accept_fd;

struct sockaddr_in client_addr;

int n;

int nbytes;

/*The server began to build the descriptor */

if((listen_fd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

exit(1);



}

/*服务器端填充sockaddr结构*/

bzero(&client_addr,sizeof(struct sockaddr_in)); //初始化,值0

client_addr.sin_family=AF_INET; //Internet

client_addr.sin_addr.s_addr=htonl(INADDR_ANY); //将本机上的long数据转化为网

络上的long数据

client_addr.sin_port=htons(portnumber);

n=1;

/*如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间*/

setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));

if(bind(listen_fd,(struct sockaddr *)(&client_addr),sizeof(client_addr))<0)

{

fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

exit(1);

}

/*设置允许连接的最大客户端数*/

listen(listen_fd,5);

while(1)

{


accept_fd=accept(listen_fd,NULL,NULL);

if((accept_fd<0)&&(errno==EINTR))

{

continue;

} else if(accept_fd<0)

{

printf("Accept Error:%s\n\a",strerror(errno));

continue;

}

if((n=fork())==0)

{

/*子进程处理客户端的连接*/

char buffer[1024];

if((nbytes = read(accept_fd,buffer,1024))==-1)

{

fprintf(stderr,"Read Error:%s\n",strerror(errno));

exit(1);

}

buffer[nbytes]='\0';

printf("Server received %s\n",buffer);


close(listen_fd);

close(accept_fd);

exit(0);

}

else

{

close(accept_fd);

}

}

return 0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: