版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西北师范大学计算机科学与工程学院 学生实验报告 系别 计算机科学与 工程学院 专业 班级 姓名 课程 名称 课程 类型 学时数 2 实验 名称 实验二、基于 TCP的服务器 / 客户端编程 学号 日期 : 实验目的 :1、掌握 Linux 下的 TCP客户端基本原理和基本编程方法 实验内容: 1 、写 Linux 下 TCP服务器套接字程序,程序运行时服务器等待客户 的连接,一旦连接成功,则显示客户的 IP 地址、端口号,并向客户端发送字 符串。 2、写 Linux 下 TCP客户端套接字程序,结合 TCP的服务器端程序,实现以下 功能: (1)、客户根据用户提供的 IP 地址连接到相应的服务
2、器; (2)、服务器等待客户的连接,一旦连接成功,则显示客户的 IP 地址、端口 号,并向客户端发送字符串; (3)、客户接收服务器发送的信息并显示。 实验步骤: 一、 TCP服务端程序设计 使用 TCP套接字编程可以实现基于 TCP/IP 协议的面向连接的通信,它分为服 务器端和客户端两部分,其主要实现过程如图所示 图 1.1 TCP 客户/ 服务器的套接字函数 、 socket 函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket 函 数获得一个文件描述符。 #include int socket(int family,int type,int protocol); 返
3、回:非负描述字成功-1 失败 第一个参数指明了协议簇,目前支持 5 种协议簇,最常用的有 AF_INET(IPv4 协议)和 AF_INET6(IPv6协议);第二个参数指明套接口类型, 有三种类型可选: SOCK_STREA字M节( 流套接口 ) 、SOCK_DGRA数M据( 报套接口 ) 和 SOCK RAW原(始套接口 ) ;如果套接口类型不是原始套接口,那么第三个参 数就为 0。 、 connect 函数:当用 socket 建立了套接口后,可以调用 connect 为这个 套接字指明远程端的地址; 如果是字节流套接口, connect 就使用三次握手建 立一个连接;如果是数据报套接口
4、, connect 仅指明远程端地址,而不向它发 送任何数据。 #include int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen); 返回: 0成功-1 失败 第一个参数是 socket 函数返回的套接口描述字;第二和第三个参数分别 是一个指向套接口地址结构的指针和该结构的大小。 这些地址结构的名字均已“ sockaddr_ ”开头,并以对应每个协议族的唯一后 缀结束。以 IPv4 套接口地址结构为例,它以“ sockaddr_in ”命名,定义在头 文件 ;以下是结构体的内容: struct in
5、_addr in_addr_t s_addr; ; struct sockaddr_in uint8_t sin_len; sa_family_t sin_family; in port t sin port; struct in_addr sin_addr; char sin_zero8; ; 、 bind 函数:为套接口分配一个本地 IP 和协议端口,对于网际协议,协议 地址是 32位IPv4 地址或 128位IPv6地址与 16位的 TCP或UDP端口号的组 合;如指定端口为 0,调用 bind 时内核将选择一个临时端口,如果指定一个 通配 IP 地址,则要等到建立连接后内核才选择一个本
6、地 IP 地址。 #include int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen); 返回: 0成功-1 失败 第一个参数是 socket 函数返回的套接口描述字;第二和第第三个参数分 别是一个指向特定于协议的地址结构的指针和该地址结构的长度。 、 listen 函数: listen 函数仅被 TCP服务器调用,它的作用是将用 sock 创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。 #include int listen(int sockfd,int backlog); 返回: 0
7、成功-1 失败 第一个参数是 socket 函数返回的套接口描述字;第二个参数规定了内核 为此套接口排队的最大连接个数。由于 listen 函数第二个参数的原因,内核 要维护两个队列: 以完成连接队列和未完成连接队列。 未完成队列中存放的是 TCP连接的三路握手为完成的连接, accept 函数是从以连接队列中取连接返回 给进程;当以连接队列为空时,进程将进入睡眠状态。 、 accept 函数: accept 函数由 TCP服务器调用,从已完成连接队列头返回 一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。 #include int accept(int listenfd, stru
8、ct sockaddr *client, socklen_t * addrlen); 回:非负描述字成功 -1 失败 第一个参数是 socket 函数返回的套接口描述字;第二个和第三个参数分别是 一个指向连接方的套接口地址结构和该地址结构的长度; 该函数返回的是一个 全新的套接口描述字; 如果对客户段的信息不感兴趣, 可以将第二和第三个参 数置为空。 6、write 和 read 函数:当服务器和客户端的连接建立起来后,就可以进行数 据传输了,服务器和客户端用各自的套接字描述符进行读 / 写操作。因为套接 字描述符也是一种文件描述符,所以可以用文件读 / 写函数 write() 和 read(
9、) 进行接收和发送操作。 (1) write() 函数用于数据的发送。 #include int write(int sockfd, char *buf, int len); 回:非负成功 -1 失败 参数 sockfd 是套接字描述符, 对于服务器是 accept() 函数返回的已连接套接 字描述符,对于客户端是调用 socket() 函数返回的套接字描述符;参数 buf 是指向一个用于发送信息的数据缓冲区; len 指明传送数据缓冲区的大小。 (2) read() 函数用于数据的接收。 #include int read(int sockfd, char *buf, intlen); 回:
10、非负成功-1 失败 参数 sockfd 是套接字描述符, 对于服务器是 accept() 函数返回的已连接套接 字描述符,对于客户端是调用 socket() 函数返回的套接字描述符;参数 buf 是指向一个用于接收信息的数据缓冲区; len 指明接收数据缓冲区的大小。 7、send 和 recv 函数: TCP套接字提供了 send() 和 recv() 函数,用来发送和 接收操作。这两个函数与 write() 和 read() 函数很相似,只是多了一个附加 的参数。 (1) send() 函数用于数据的发送。 #include #include ssize t send(int sockfd
11、, const void *buf, size t len, int flags); 回:返回写出的字节数成功 -1 失败 前 3 个参数与 write() 相同,参数 flags 是传输控制标志。 (2) recv() 函数用于数据的发送。 #include #include ssize t recv(int sockfd, void *buf, size t len, int flags); 回:返回读入的字节数成功 -1 失败 前 3 个参数与 read() 相同,参数 flags 是传输控制标志。 实验步骤 1、登陆进入 ubuntu 操作系统,新建一个文件,命名为 tcpserver
12、.c (为了方 便起见,可以进入“home”,再进入用户目录, 在用户目录下新建 tcpserver.c )。 2、在 tcpserver.c 中编写服务器端程序代码并保存。 3、在“终端”(“ Applications ”“附件”“终端”)中执行命令进入 tcpserver.c 所在目录。 (pwd命令可以显示当前所在目录; ls 命令可以显示 当前目录下的文件和文件夹信息; cd. 命令可以进入上一级目录; cd 目录名 命令可以进入当前所示的某个目录。) 4、执行命令 gcc o tcpserver tcpserver.c生成可执行文件 tcpserver 。 5、执行命令 ./ tcp
13、server ,观察结果。 6、认真分析源代码,体会如何编写一个 TCP服务器端程序。 参考程序 #include #include #include #include #include #include #include #include #definePORT 1234 #defineBACKLOG1 int main() int listenfd, connectfd; struct sockaddr_in server; struct sockaddr_in client; socklen_t addrlen; if(listenfd = socket(AF_INET, SOCK_ST
14、REAM0, ) = -1) sizeof(opt); perror(Creating socket failed.); exit(1); int opt =SO_REUSEADDR; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR server.sin family=AF INET; eof(server) ten() */ server.sin_port=htons(PORT); server.sin_addr.s_addr= htonl (INADDR_ANY); if(bind(listenfd, = -1) perror(Binderror.)
15、; exit(1); (struct sockaddr *) exit(1); addrlen =sizeof(client); sockaddr*) if(connectfd = accept(listenfd,(struct exit(1); printf(Yougot a connection from cients ip is %s, prot is %dn,inet_ntoa(client.sin_addr),htons(client.sin_ port); send(connectfd,Welcometo my server.n,22,0); close(connectfd); c
16、lose(listenfd); return 0; 二、 TCP客户端程序设计 实验步骤 1、登陆进入 ubuntu 操作系统,新建一个文件,命名为 tcpclient.c (为了方 便起见,可以进入“home”,再进入用户目录, 在用户目录下新建 tcpclient.c ) 2、在 tcpclient.c 中编写客户端程序代码并保存。将实验一完成的 tcpserver.c 拷贝到与 tcpclient.c 同一目录下。 3、在“终端”(“ Applications ”“附件”“终端”)中执行命令进入 tcpserver.c 和 tcpclient.c 所在目录。 4、执行命令 gcc o t
17、cpserver tcpserver.c生成可执行文件 tcpserver 。 5、执行命令 ./ tcpserver 。 6、再开一个“终端”,进入 tcpserver.c 和 tcpclient.c 所在目录,执行命 令 gcc o tcpclient tcpclient.c 生成可执行文件 tcpclient 。 7、执行命令 ./ tcpclient 127.0.0.1。 8、观察两个“终端”出现的结果。 9、认真分析源代码,体会如何编写一个 TCP客户端程序。 参考程序 #include #include #include #include #include #include #in
18、clude #include #define PORT 1234 #defineMAXDATASIZE1 00 int main(int argc, char *argv) . int sockfd, num; char bufMAXDATASIZE; struct hostent *he; struct sockaddr_in server; if (argc!=2) printf(Usage:%s n,argv0); exit(1); if(he=gethostbyname(argv1)=NULL) printf(gethostbyname()errorn); exit(1); if(sockfd=socket(AF_INET,SOCK_STREAM0, )=-1) printf(socket()errorn); exit(1); bzero( server.sin_family=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2440-2026机动车转向盘转向力-转向角检测仪校准装置校准规范
- 初中生物七年级《感受器和感觉器官-眼与视觉》教学设计
- 2025食堂从业人员培训考试试题及答案
- 2025下半年中学教师资格证《综合素质》考试真题及答案解析
- 2026年衡阳市烟草专卖局人员招聘考试备考题库及详细答案解析
- 2025医师定期考核考试真题及答案
- 2026版《药物临床试验质量管理规范(GCP)》完整测试题(含答案+解析)
- 2026车辆检测师考试题及答案
- 2026广东(中考)道德与法治试卷(原卷及答案)
- 2026临床医师定期考核必刷题库及参考答案
- 2026中国集装箱租赁市场供需格局与价格波动预测报告
- 2026-湖南省妇联招聘考试参考题库-含答案
- 第2课 俄国的改革 课件
- 2026年中国电信应届生校园招聘笔试真题(含详细答案解析)
- 2026年医院财务科招聘岗位适配试题含答案
- 创伤性心搏骤停心肺复苏救治专家共识(2025版)完整版 + 损伤控制操作路径
- 护理部针刺伤职业暴露应急演练脚本
- 2026中国甲醇燃料电池汽车示范运营补贴力度
- (正式版)DB42∕T 489-2026 《预应力混凝土管桩及空心方桩技术规程》
- 2026年市场监督管理局招聘题库及答案
- T∕AOPA 0086-2025 T∕CMSA 0058-2025 低空飞行器起降场地气象监测系统建设要求
评论
0/150
提交评论