例程
代码如下,在处理客户端请求之前,服务器先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服务器的配置文档主要针对应用层中的协议。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)