Linux环境下的重复性服务器/客户端编程实验

版权申诉
0 下载量 61 浏览量 更新于2024-09-02 收藏 284KB PDF 举报
"实验10重复性服务器/客户机编程实验" 这个实验旨在让学生深入了解重复性服务器的工作原理以及如何在Linux环境下进行相关的编程实践。实验的主要目标是掌握服务器的重复性设计,即服务器能处理多个并发连接,并且在每个连接完成后能够继续服务下一个客户。 在实验内容中,给出了两个主要的程序:服务器程序和客户端程序。服务器程序需要监听客户端的连接,一旦有连接建立,它会显示客户端的地址,并接收来自客户端的字符串。服务器将接收到的字符串反转后再发送回客户端,然后继续等待新的信息,直到客户端关闭连接。客户端程序则负责与服务器建立连接,接收用户的输入,将输入的字符串发送到服务器,再显示从服务器返回的信息。客户端会在接收到用户输入`Ctrl-D`时关闭连接并退出。 代码示例展示了客户端的实现,包含了一些关键的系统调用和头文件: 1. `#include<stdio.h>`,`#include<unistd.h>`,`#include<strings.h>`,`#include<sys/types.h>`,`#include<sys/socket.h>`,`#include<netinet/in.h>`,`#include<netdb.h>`:这些头文件提供了进行网络编程所需的函数和数据类型,如文件操作、网络套接字和主机信息。 2. 定义常量`PORT1234`为服务器端口,`MAXDATASIZE100`为最大数据包大小。 3. `intmain(intargc,char*argv[])`:这是程序的主入口点,`argc`和`argv`是命令行参数。 4. `intfd`, `structhostent*he`, `structsockaddr_inserver`:分别用于存储文件描述符、远程主机信息结构体和服务器的地址信息。 5. `if(argc!=2)`:检查命令行参数是否正确,确保指定了服务器的IP地址。 6. `gethostbyname()`:通过域名获取远程主机的地址信息。 7. `struct sockaddr_in`和`bind()`:定义服务器的套接字地址结构体,并将其绑定到指定端口。 8. `listen()`:使服务器进入监听状态,等待客户端连接。 9. `accept()`:接受客户端的连接请求,返回一个新的文件描述符用于与客户端通信。 10. `process()`和`getMessage()`:这两个函数是实验中的辅助函数,`process()`处理与客户端的通信,`getMessage()`从文件或用户输入读取字符串。 11. `send()`和`recv()`:用于发送和接收网络数据。 12. `fclose()`, `close()`:关闭文件和套接字连接。 这个实验不仅涵盖了基本的网络编程概念,如套接字、连接建立、数据传输,还涉及到服务器的并发处理能力。通过实际操作,学生可以深入理解TCP/IP协议栈在实际应用中的运作方式,以及如何在Linux环境中编写高效的服务器和客户端程序。

优化这段代码:def calTravelCost(route_list,model): timetable_list=[] distance_of_routes=0 time_of_routes=0 obj=0 for route in route_list: timetable=[] vehicle=model.vehicle_dict[route[0]] travel_distance=0 travel_time=0 v_type = route[0] free_speed=vehicle.free_speed fixed_cost=vehicle.fixed_cost variable_cost=vehicle.variable_cost for i in range(len(route)): if i == 0: next_node_id=route[i+1] travel_time_between_nodes=model.distance_matrix[v_type,next_node_id]/free_speed departure=max(0,model.demand_dict[next_node_id].start_time-travel_time_between_nodes) timetable.append((int(departure),int(departure))) elif 1<= i <= len(route)-2: last_node_id=route[i-1] current_node_id=route[i] current_node = model.demand_dict[current_node_id] travel_time_between_nodes=model.distance_matrix[last_node_id,current_node_id]/free_speed arrival=max(timetable[-1][1]+travel_time_between_nodes,current_node.start_time) departure=arrival+current_node.service_time timetable.append((int(arrival),int(departure))) travel_distance += model.distance_matrix[last_node_id, current_node_id] travel_time += model.distance_matrix[last_node_id, current_node_id]/free_speed+\ + max(current_node.start_time - arrival, 0) else: last_node_id = route[i - 1] travel_time_between_nodes = model.distance_matrix[last_node_id,v_type]/free_speed departure = timetable[-1][1]+travel_time_between_nodes timetable.append((int(departure),int(departure))) travel_distance += model.distance_matrix[last_node_id,v_type] travel_time += model.distance_matrix[last_node_id,v_type]/free_speed distance_of_routes+=travel_distance time_of_routes+=travel_time if model.opt_type==0: obj+=fixed_cost+travel_distance*variable_cost else: obj += fixed_cost + travel_time *variable_cost timetable_list.append(timetable) return timetable_list,time_of_routes,distance_of_routes,obj

2023-06-11 上传