计算机系统平台实验——面向连接的服务器端程序设计(可实现通信和显示文件内容,包括进程管理)

本文介绍了一次计算机系统平台实验,重点是设计一个使用多进程的TCP服务器,能接收客户端文件名请求并返回文件内容。实验详细阐述了服务器与客户端的实现步骤,包括信号处理僵尸进程、文件读取和发送。通过实验,作者深化了对TCP通信和服务器客户端编程的理解。
摘要由CSDN通过智能技术生成


实验目的

实验目的:熟悉网络程序接口,了解TCP连接,掌握客户端软件设计的基本算法。
实验内容:写一个简单的网络文件服务器,该服务器能够为多个客户并发提供服务。服务器从客户端接收文件名,并用请求的文件内容应答客户端。
要求:
用多进程来实现并发;
为每个用户产生一个服务器进程;
要求用信号处理僵尸子进程;
与实验三编写客户端程序通信。客户端从终端输入名字,并显示回来的结果。
提示:服务器和客户端运行时用命令 “pstree” 来看创建的进程数是否正确。

实验截图

服务器端接收客户端传来的信息:
服务器截图1
服务器截图2
客户端接收服务器发送来的信息:
客户端截图
通过进程管理获取客户端与服务器的进程号:
进程管理
通过ps au查看有无僵尸进程::
查看僵尸进程
打印进程树:
进程树

实验步骤

服务器搭建步骤:
(1)在主函数之中建立参数传接端口
(2)定义TCP所需的网络参数,例如IP地址与端口号,配置sockaddr_in结构体。建立socket连接,建立char类型的缓冲区,定义至多传输4096字节的数据
(3)配置socket,bind,listen,启动accept使得服务器被动开启
(4)配置SIGCHLD至信号中,使得父进程能够主动清理僵尸子进程,根据用户连接使用fork创建子进程执行与客户端的通信。
(5)通过recv函数从TCP另一端接受数据,清空缓冲区,得到目标数据
(6)根据获得目标数据查找相对应文件,写入文件流中,输出文件内容后将内容发送给客户端
(7)关闭文件流与通信流,主进程退出
客户端搭建步骤:
(1)在主函数之中建立参数传接端口
(2)定义TCP所需的网络参数,例如IP地址与端口号,配置sockaddr_in结构体。建立socket连接,建立char类型的缓冲区,定义至多传输4096字节的数据
(3)填写服务器地址信息,定义传输格式,发起对服务器的连接,进行三次握手
(4)使用格式转化获得参数的长度,将参数发送到服务器端
(5)通过recv函数从TCP服务器端接受数据,清空缓冲区,得到目标数据
(6)从缓冲区中读取服务器传来的数据,显示在屏幕上
(6)关闭通信流,客户端退出,服务器阻塞

源码

服务器端代码

#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h> 
#include <string.h>
#include <string>
#include <fstream>
#include <sstream> 
#include <streambuf>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>  
#include <unistd.h>  
#include <signal.h>  
#include <errno.h>  
#include <sys/wait.h>
#define BUF_SIZE 4096 //限制最大发送4096个字节
using namespace std;
void waitchild(int sig) {
     
   
  int status;  
  wait(&status);  
   
}
int main(int argc, char *argv[])
{
   
	int sock_fd, conn_fd,sendbytes;
	struct sockaddr_in server_addr;
	char buff[BUF_SIZE];//指定缓冲区长度
	int ret;
	
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP服务器端程序设计一般分为以下几个步骤: 1. 创建套接字:使用系统调用socket()创建一个TCP套接字。 2. 绑定套接字:使用系统调用bind()将套接字与IP地址和端口号绑定在一起。 3. 监听连接请求:使用系统调用listen()开始监听客户端连接请求。 4. 接受连接请求:使用系统调用accept()接受客户端连接请求,创建新的套接字来处理该客户端的请求。 5. 与客户端通信:使用系统调用read()和write()与客户端进行通信,完成所需的数据传输。 6. 关闭套接字:使用系统调用close()关闭已经处理完毕的套接字。 下面是一个简单的TCP服务器端程序的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 8080 #define MAX_CLIENTS 5 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // 创建TCP套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置套接字选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } // 绑定套接字 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( PORT ); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(server_fd, MAX_CLIENTS) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受连接请求,并与客户端通信 while(1) { if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } valread = read( new_socket , buffer, 1024); printf("%s\n",buffer ); send(new_socket , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); close(new_socket); } return 0; } ``` 以上代码实现了一个简单的TCP服务器端程序,它可以监听客户端连接请求,并接受来自客户端的数据,在向客户端发送回应后关闭连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值