操作系统课程实验报告6.docx





《操作系统课程实验报告6.docx》由会员分享,可在线阅读,更多相关《操作系统课程实验报告6.docx(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中央民族大学操作系统实验报告姓名:黄越俊年学号:21011656.2021.M级:院系:信息工程学院专业:软件工程2023亲5月16日printf(Server Bind Port: %d Failed!n, HELLO_WORLD_SERVER_PORT);exit(l);1/ servejsocket 用于监听if (listcn(scrvcr_sockct, LENGTH_OF_LISTEN_QUEUE)printf(Server Listen Failed!n);exit(l);1服务器端一直运行用以持续为客户端提供服务whilc( 1)/定义客户端的socket地址结构client_
2、addr,当收到来自客户端的请求后,调用accept/接受此请求,同时将client端的地址和端口等信息写入clienl_addr中struct sockaddr_in client_addr;socklcn_t length = sizcof(clicnt_addr);接受一个从client端到达server端的连接请求,将客户端的信息保存在client_addr中 如果没有连接请求,则一直等待直到有连接请求为止,这是accepl函数的特性,可以 /用select。来实现超时检测/ accpet返回一个新的socket,这个socket用来与此次连接到server的client进行通信/这里
3、的new_server_socket代表了这个通信通道int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);if (new_server_socket 0)printf(Server Accept Failed!n);break;)char bufferBUFFER_SIZEj;bzero(buffer, sizeof(buffer);length = rccv(ncw_server_socket, buffer, BUFFER_SIZE, 0);if (length FIL
4、E_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE : strlen(buffer);FILE *fp = fopen(tile_name, r);if(fp= NULL) printf(File:(%s Not Found!n, file_name);1else(hzero(buffer, BUFFER_SIZE);int file_block_length = 0;while( (file_block_length = fread(buffer, sizcof(char). BUFFER_SIZE, fp) 0) (printf(file_blockength = %
5、dn file_block_length);/发送buffer中的字符串到new_server_socket,实际上就是发送给客户端 if (send(new_server_socket, buffer, file_block_length, 0) 0)(printf(Scnd Filc:t%s Failcd!n file_namc); break;)bzero(buffer, sizeof(buffer);)fclose(fp);printf(File:t%s Transfer Finished!, file_name);Iclose(new_server_socket);close(sen
6、er_socket);return 0;#include#include#include#include/ for sockaddr_in/ for socket#include/ for socket/ for printf/ for exit#include#include / for bzero#define HELLO WORLD SERVER PORT6666#dcfinc BUFFER SIZE1024#define FILE_NAME_MAX_SIZE 512int main(inl argc, char *argv)if (argc != 2)printf(Usagc: ./%
7、s ScrvcrlPAddrcssn, argvO);exit(l);/设置一个socket地址结构client_addr,代表客户机的internet地址和端口struct sockaddr_in clicnt_addr;bzero(&client_addr, sizeof(client_addr);clicnt_addr.sin_family = AF_INET; / internet 协议族client_addr.sin_addr.s_addr = hions(INADDR_ANY); / INADDR.ANY 表示自动获取木机地址client_addr.sin_port = htons
8、(O); / auto allocated,让系统自动分配 *个空闲端口/创建用于internet的流协议(TCP)类型socket, JU client_socket代表客户端socketint clicnt_sockct = sockct(AF_INET, SOCK_STREAM, 0);if (client_soket 0)(prinlf(Crea(e Socket Failed八n);exit(l);I/把客户端的socket和客户端的socket地址结构绑定if (bind(client_socket, (struct sockaddr*)&client_addr, sizeof(c
9、lient_addr)printfCClient Bind Port Failed!1);exit(l);)设置一个socket地址结构servejaddr,代表服务器的internet地址和端口struct sockaddr_in server_addr;bzcro(&ser cr_addr, sizcof(server_addr);server_addr.sin_family = AF_INET;服务器的IP地址来自程序的参数if (inet_aton(argvl, &server_addr.sin_addr) = 0)printfCSenr IP Address Error!n);cxi
10、t(l);server_addr.sin_port = hions(HELLO_ WORLD一SERVER一PORT): socklen_t server_addr_length = sizeof(server_addr);/向服务器发起连接请求,连接成功后client_socket代表客户端和服务器端的一个socket连接 if (conncct(clicnt_sockct, (struct sockaddr*)&scrver_addr, scrvcr_addr_lcngth) BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name);/向服务器发送buff
11、er中的数据,此时buffer中存放的是客户端需要接收的文件的名字 send(client_socket, buffer. BUFFER_SIZE. 0);FILE *fp = fopen(file_name, w);if(fp= NULL) printf(File:t%s Can Not Open To Write!n, file_nanie); exit(l);I/从服务器端接收数据到buffer中 bzero(buffer, sizeof(buffer);int length = 0;while(length = recv(client_socket, buffer, BUFFER_SI
12、ZE. 0)if (length 0)printf(Recieve Data From Server %s Failed!n, argv 1 ); break;)int write_length = fwrite(buffer, sizeof(char), length, fp);if (wnte_length length) printf(File:t%s Write Failed!n, file_name); break;bzero(buffer, BUFFER_SIZE);printf(Rccicvc Filc:t %s From Scrvcrl%s Finishcd!n, filc_n
13、amc, argv 1 );传输完毕,关闭socketfclose(fp);close(client_socket);return 0;3.编程实现一端可循环向另一端传送字符串Client.c#include #include #includc#include #include #include #include #include #include # define LENGTH_OF_LISTEN_QUEUE 10/length of listen queue in server#define WELCOME_MESSAGE welcome to connect the server.# d
14、cfinc SERVER_PORT 2000 / define the dcfualt connect port id#define CLIENT_PORT (2001 +rand()%65536) / define the defualt client port as a random port# dcfine BUFFER.SIZE 255#define REUQEST_MESSAGE welcome (o connect (he server.nvoid usage(char *name) printf(input host IP: %s IpAddrn,namc);)int main(
15、inl argc, char *argv) printf(%d %s %s M,argc, argv0J,argv 1 J);int servfd,c)ifd,length = 0;struct sockaddr_in scrvaddr,cliaddr:socklen_t socklen = sizeof(sen-addr);char buf|BUFFER_SIZEJ; / BUFFER_SIZE=255if (argc 2)usage(argvOJ); argv涓 氨铸?/client.out 调用写好的 usage 函数打印 argvO exit( 1);)Z/AF_INET ( PF_I
16、NET ),表示互联网协议族(TCP/IP协议族);AFNET: Ipv4网络协议;ocket的 类型:SOCK.STREAM ; o()选择type类型对应的默认协议if(clifd = socket(AFJNET,SOCK_STREAM,0) 0) /返回值 clifd 小于 0 失败printf(create socket error!n);exit(l);)srand(time(NULL); /initialize random generatorbzcro(&cliaddr,sizcof(cliaddr);cliaddr.sin_family = AFNET;/地址族:AFNET (
17、 PF_INET ),表示互联网协议族(TCP/IP 协议 族);AFNET: Ipv4网络协,议cliaddr.sin_port = htons(CLIENT_PORT):/ CLIENT_PORT (2(X) 1+rand()%65536) / 将 dcfalt 客户端 端口定义为随机端口cliaddr.sin_addr.s_addr = htons(INADDR_ANY); / IP 地址:INADDR_ANY,系统会自动填入本机 IP 地址bzero(&servaddr,sizeof(servaddr);seaddr.sin_family = AF_INET; 地址族:AFNET (
18、PFJNET ),表示互联网协议族(TCP/IP 协 议族);AFNET: Ipv4网络协议inct_aton(argvl 1 ,&scnfaddr.sin_addr);/功能是将一个字符串IP地址转换为一个32位的网络序列 IP地址。servaddr.sin_port = h(ons(SERVER_PORT);if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cIiaddr)0)printf(bind to port %d failurc!n,CLlENT_PORT);exit(l);if (connect(clifd/struct socka
19、ddr*)&servaddr, socklen) 0)(prinlf(cant connect to %s!nH,argvl);exit(l);while (1) 循环接收数据length=recv(clifd,buf.BUFFER_SIZE,O);/输出接收到的数据if(buf=n false*)break;printf(Message form server: %sn. buf):memset(buf, 0, BUFFER_SIZE); 重胃.缓冲区/ length = recv(clifd.buf,BUFFER_SIZE,O); recv()这两个函数用于面向连接的socket上进行数据
20、传 输,clifd是接受数据的socket描述符;buf是存放接收数据的缓冲区;BUFFER_SIZE=255是缓冲的长 度。Flags也被置为0。if (length 0)(printf(error conics when rccicvc data from server %s!,argv 1 J);exit(l);)prinlf(from server %s :nt %s n.argvl ,buf);close ifd); 关闭return 0;IScrvcr.c#include #include #include#include #include #include #include #i
21、nclude #include #define LENGTH_OF_LISTEN_QUEUE 10/length of listen queue in server#define WELCOME_MESSAGE welcome to connect the server.#define SERVER_PORT 2000 / define the defualt connect port id#define CLIENT_PORT (2001+rand()%65536) / define the defualt client port as a random port#dcfine BUFFER
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程 实验 报告

限制150内