linux实验报告 联系客服

发布时间 : 星期日 文章linux实验报告更新完毕开始阅读49185a84336c1eb91b375d34

{

int i;

msgqid=msgget(MSGKEY,0777); /*打开75#消息队列*/ for(i=10;i>=1;i--) {

msg.mtype=i;

printf(“(client)sent\\n”);

msgsnd(msgqid,&msg,1024,0); /*发送消息msg入msgid消息队列*/ } exit(0); } main( ) {

client( ); }

②server.c void server( ) {

+msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*消息队列*/ do {

msgrcv(msgqid,&msg,1030,0,0); /* printf(“(server)received\\n”); }

while(msg.mtype!=1); /* msgctl(msgqid,IPC_RMID,0); /* exit(0); } main( ) { server( ); }

(2)运行结果:

25 创建75#消息队列,由关键字获得从队列msgid接受消息msg*/ 消息类型为1时,释放队列*/ 删除消息队列,归还资源*/

(3)分析原因:

按理来说,执行结果应该是“(client)sent”和“(server)received”的字样在屏幕上交替出现。然而实际结果是,先由 client 发送十条消息,然后server接收十条消息。此后client和server交替发送和接收消息, 因此client 和server 分别发送和接收了10条消息,与预期设想一致,如运行结果(2)所示。

二、程序设计思路和方法

(1)编写程序client.c和server.c作为“引子”,先后使用系统调用fork()两个子进程server和client进行通信。

(2)client端使用KEY为75的消息队列,先后发送类型从10到1的消息后退出。最后的一个消息即是server端需要的结束信号。client每发送一条消息后显示一句“(client)sent”。 (3)server端建立一个KEY为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息时,则作为结束信号,取消该队列并退出server。server每接收到一个消息后显示一句“( server) received”。

(4)父进程在server和client均退出后结束。

26

三、实验总结

在消息的发送与接收的实验过程中,使用msgget()方法可以创建一个消息,获得一个消息的描述符;msgsnd()方法向指定的消息队列发送一个消息,并将该消息链接到该消息队列的尾部等。在编写程序client.c和server.c时,应用到了此类方法。在调试过程中,client发送一句消息同时在终端显示(client)sent,server就接收该消息并在终端显示( server) received,此后client和server交替发送和接收消息,最后server一次接收两条消息。虽然在实验过程中,部分代码难懂,对于功能分析造成困扰,但整体还不错,总算把消息的发送与接收这个实验做完了。

实验四编写Web服务器

【实验目的】

通过编写一个比较实用的Web服务器程序,消除学生对Web服务程序的神秘感和恐惧心理,增强学生的信心。在这个过程中,可以使学生熟练掌握socket编程,以及调试技巧。由于Web服务器要使用多进程(或多线程),让学生对进程有更深入的理解。让学生了解HTTP协议,消除其神秘感。

【报告内容】

1.服务器设计重点

基于socket的客户/服务器系统大多是类似的。一旦理解了一个socket流的客户/服务器系统,就可以理解大多数其他的系统。

2.三个主要操作

客户和服务器都是进程。服务器设立服务,然后进入循环接收和处理请求。客户连接到服务器,然后发送、接受或者交换数据,最后退出。该交互过程中主要包含了一下三个操作: (1)服务器设立服务 (2)客户连接到服务器 (3)服务器和客户处理事务

27

客户: 服务器:

建立服务 连接到服务器 接收请求 获取服务 提供服务 挂断连接 挂断连接

3.连接过程

操作1:建立服务器端socket

设立一个服务一般需要如下3个步骤: (1)创建一个 socket

socket = socket ( PF_INET, SOCK_STREAM, 0 ) (2)给 socket 绑定一个地址 bind ( sock, &addr, sizeof(addr) ) (3)监听接入请求 listen ( sock, queue_size )

步骤1:

创建一个服务器端socket

为了避免在编写服务器时重复输入上述代码,将这3个步骤组合成一个函数:make_server_socket。在编写服务器的时候,只需调用该函数就可以创建一个服务端socket。具体如下:

sock=make_server_socket(int portnum)

return -1 if error, or a server socket listening at port ―portnum‖

28