tcp并发服务器通讯模型有哪些

tcp并发服务器通讯模型有哪些,第1张

服务器创建并绑定套接字后fork出几个子进程,子进程中分别进行accept(该函数为阻塞函数)、recv、处理数据然后再次acept,这样循环下去。所有客户端发来的信息都是直接由子进程处理。

例程

代码如下,在处理客户端请求之前,服务器先fork了3个子进程,然后将客户端的请求直接交由子进程处理。

该例程中,服务器fork子进程后,子进程监听并接收客户端的信息,然后打印客户端发来的信息和自己的id(id代表自己是第几个子进程)

服务器端代码:

/**************************************

author:arvik

purpose:test the server simultaneity

email:1216601195@qq.com

csdn: http://blog.csdn.net/u012819339

**************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <signal.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define BUFFLEN 1024

#define SERVER_PORT 8887

#define BACKLOG 5

#define PIDNUMB 3

static void handle_connect(int s_s, int id)

{

int s_c

struct sockaddr_in from //client addr

socklen_t len = sizeof(from)

while(1)

{

s_c = accept(s_s, (struct sockaddr*)&from, &len)

char buff[BUFFLEN]

memset(buff, 0, BUFFLEN)

int n = recv(s_c, buff, BUFFLEN, 0) //non block

if(n >0)

{

printf("This process id is: %d \nreveive from client: %s\n", id, buff)

}

close(s_c)

}

}

void sig_int(int num)

{

exit(1)

}

int main(int argc, char **argv)

{

int s_s

struct sockaddr_in local

signal(SIGINT, sig_int)

s_s = socket(AF_INET, SOCK_STREAM, 0)

memset(&local, 0, sizeof(local))

local.sin_family = AF_INET

local.sin_addr.s_addr = htonl(INADDR_ANY)

local.sin_port = htons(SERVER_PORT)

bind(s_s, (struct sockaddr*)&local, sizeof(local))

listen(s_s, BACKLOG)

pid_t pid[PIDNUMB]

for(int i = 0i<PIDNUMBi++)

{

pid[i] = fork()

if(pid[i] == 0)

{

handle_connect(s_s, i)

}

}

sleep(100)

close(s_s)

return 0

}

客户端代码:

/**************************************

author:arvik

purpose:test the server simultaneity

email:1216601195@qq.com

csdn: http://blog.csdn.net/u012819339

**************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <signal.h>

#define BUFFLEN 24

#define SERVER_PORT 8887

int main()

{

int s_c

struct sockaddr_in server

char buff[] = "hello"

s_c = socket(AF_INET, SOCK_STREAM, 0)

memset(&server, 0, sizeof(server))

server.sin_family = AF_INET

server.sin_addr.s_addr = htonl(INADDR_ANY)//any local address

server.sin_port = htons(SERVER_PORT)

connect(s_c, (struct sockaddr*)&server, sizeof(server))

send(s_c, buff, strlen(buff), 0)

sleep(1)

close(s_c)

return 0

}

1.网络接口

网络接口把数据链路层和物理层放在一起,对应TCP/IP概念模型的网络接口。对应的网络协议主要是:Ethernet、FDDI和能传输IP数据包的任何协议。

2.网际层

网 络层对应Linux TCP/IP概念模型的网际层,网络层协议管理离散的计算机间的数据传输,如IP协议为用户和远程计算机提供了信息包的传输方法,确保信息包能正确地到达 目的机器。这一过程中,IP和其他网络层的协议共同用于数据传输,如果没有使用一些监视系统进程的工具,用户是看不到在系统里的IP的。网络嗅探器 Sniffers是能看到这些过程的一个装置(它可以是软件,也可以是硬件),它能读取通过网络发送的每一个包,即能读取发生在网络层协议的任何活动,因 此网络嗅探器Sniffers会对安全造成威胁。重要的网络层协议包括ARP(地址解析协议)、ICMP(Internet控制消息协议)和IP协议(网 际协议)等。

3.传输层

传输层对应Linux TCP/IP概念模型的传输层。传输层提供应用程序间的通信。其功能包括:格式化信息流;提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认信 息,如果分组丢失,必须重新发送。传输层包括TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议),它们是传输层中最主要的协议。TCP建立在IP之上,定义了网络上程序到程序的数据传输格式和规则,提供了IP数据 包的传输确认、丢失数据包的重新请求、将收到的数据包按照它们的发送次序重新装配的机制。TCP 协议是面向连接的协议,类似于打电话,在开始传输数据之前,必须先建立明确的连接。UDP也建立在IP之上,但它是一种无连接协议,两台计算机之间的传输 类似于传递邮件:消息从一台计算机发送到另一台计算机,两者之间没有明确的连接。UDP不保证数据的传输,也不提供重新排列次序或重新请求的功能,所以说 它是不可靠的。虽然UDP的不可靠性限制了它的应用场合,但它比TCP具有更好的传输效率。

4.应用层

应 用层、表示层和会话层对应Linux TCP/IP概念模型中的应用层。应用层位于协议栈的顶端,它的主要任务是应用。一般是可见的,如利用FTP(文件传输协议)传输一个文件,请求一个和目 标计算机的连接,在传输文件的过程中,用户和远程计算机交换的一部分是能看到的。常见的应用层协议有:HTTP,FTP,Telnet,SMTP和 Gopher等。应用层是Linux网络设定最关键的一层。Linux服务器的配置文档主要针对应用层中的协议。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/279077.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存