
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux下基本tcp socket编程之服务器端首先,在编程之前,需了解网络上两台主机通过tcp通信的基本原理,建立衔接时的三次握手及断开衔接时的四次握手,在此便不再讲述。 下面,先列出服务器端的代码,再逐一举行分析。 1 ilude stdio.h 2 include sings.h 3 include unistd.h 4 include sys/types.h 5 include sys/socket.h 6 include netinet/in.h 7 include arpa/inet.h 8 9 define port 1234 /端口号10 define backlog 1 /
2、哀求队列中的最大衔接数11 12 int main()13 14 int listenfd, connectfd; /监听套接字描述符与衔接套接字描述符15 struct sockar_in server, client; /服务器端和客户端ipv4地址信息16 socklen_t addrlen;17 18 /用法socket()函数,产生tcp套接字19 if(listenfd = socket(af_inet, sock_stream, 0) = -1)20 21 perror("socket() error.");22 it(1);23 24 25 int opt
3、= 1;26 /设置套接字选项,用法so_reuseaddr允许套接口和一个已经在用法中的地址绑定27 sockopt(listenfd, sol_socket, so_reuseaddr, opt, sizeof(opt);28 /初始化server套接字地址结构29 bzero( server, sizeof(server);30 server.sin_family = af_inet;31 server.sin_port = htons(port);32 server.sin_addr.s_addr = htonl(inaddr_any);33 34 /用法bind()函数,将套接字与指
4、定的协议地址绑定35 if(bind(listenfd, (struct sockaddr *) server, sizeof(server) = -1)36 37 perror("bind() error");38 exit(1);39 40 41 /用法listen()函数,等待客户端的衔接42 if(listen(listenfd, backlog) = -1)43 44 perror("listen() error.n");45 exit(1);46 47 48 addrlen = sizeof(client);49 50 51 /不断监听客户端
5、的哀求52 while(1) 53 54 /接受客户端的衔接,客户端的地址信息放在client地址结构中55 if(connectfd = accept(listenfd, (struct sockaddr *) client, addrlen) = -1)56 57 perror("accept() errorn");58 exit(1);59 60 61 /用法inet_ntoa()将网络字节序的二进制ip地址转换成相应的点分十进制ip地址62 /用法ntohs()将16位的短整型数从网络字节序转换成主机字节序63 printf("you got a conn
6、ection from client's ip is %s, port is %dn", 64 inet_ntoa(client.sin_addr), ntohs(client.sin_port);65 /服务器端对衔接的客户端发送一条信息66 send(connectfd, "welcomen", 8, 0);67 /关闭与客户端的衔接68 close(connectfd);69 70 71 close(listenfd);72 return 0;73 下面详细分析下服务器端的建立衔接的过程以及用到的几个重要函数。 tcp套接字编程中,服务器端实现的步骤
7、如下: (1)用法socket()函数创建套接字。 (2)将创建的套接字绑定到指定的地址结构。 (3)listen()函数设置套接字为监听模式,使服务器进入被动打开的状态。 (4)接受客户端的衔接哀求,建立衔接。 (5)接收、应答客户端的数据哀求。 (6)终止衔接。 几个重要的函数: (1)socket()函数如下: include sys/socket.h int socket(int family, int type, int proto); family参数指明白协议族,它的值通常为:af_inet(ipv4协议)、af_inet6(ipv6协议)、af_route(路由套接口)。typ
8、e参数指明产生套接字的类型,它的值通常为:sock_stream(tcp用法这种形式)、sock_dgram(udp用法这种形式)、sock_raw(原始套接口)。protocol参数是协议标记,普通在调用socket()函数时将其置为0。 (2)bind()函数如下: include sys/socket.h int bind(int sockfd, const struct sockaddr *server, socklen_len addrlen); 绑定函数的作用是为调用socket()函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系。注重:协议地址addr是通用地址。
9、sockfd参数是之前调用socket()函数返回的套接字描述符。server参数为一个结构体,其中包含了服务器端的地址信息。因此,必需在调用bind()函数之前,初始化该结构体,指定服务器端绑定的端口号以及ip地址。sockaddr结构体定义在头文件 netinet/in.h 中。其中,ipv4套接字地址结构如下: typef uint32_t in_addr_t;typedef uint16_t in_port_t;typedef unsigned short sa_family_t;struct in_addr in_addr_t s_addr;struct sockaddr_in ui
10、nt8_t sin_len; sa_family_t sin_family; /协议族类型 in_port_t sin_port; /端口号 struct in_addr sin_addr; /ip地址 char sin_zero8; /保留用法; 注重,server中相关字段在初始化时,必需是网络字节序。addrlen参数是该地址结构(其次个参数)的长度。 (3)listen()函数如下: include sys/socket.h int listen(int sockfd, int backlog); 该函数比较容易,调用listen()函数后,将未衔接的套接字转换成被动套接字,使它处在监
11、听模式下,服务器的状态从closed转换到了listen状态。 (4)accept()函数如下: include sys/socket.h int accept(int listenfd, struct sockaddr *client, socklen_t *addr_len); accept()函数使服务器接受客户端的衔接哀求。该函数最多返回三个值:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由client所指),以及该地址的大小(这后两个参数是值结果参数);也就是说,服务器可以通过参数client来得到哀求衔接并获得胜利的客户的地址和端口号。在实际用法中,假如服务
12、器端并不想保存客户的地址和端口号,也可以用法accept(listenfd, null, null)。 至此,服务器与客户端的衔接便建立了,接下来便是数据的发送和接收。发送和接收数据可以用法(),read()/send(),recv()函数。 (5)send()函数如下: include sys/types.h include sys/socket.h ssize_t send(int sockfd, const vo *buf, size_t len, int flags); 参数sockfd为套接字描述符,参数buf指向一个用于发送信息的数据缓冲区,len指明传送数据缓冲区的大小。参数flags是传输控制标记,当值为0时,函数所作的操作与write()相同。 (6)recv()函数如下: include sys/types.h include sys/socket.h ssize_t recv(int sockfd, void *buf, size_t len, int flags); 其使用与send
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 毕业主持词开场白台词
- 2019-2025年中级会计职称之中级会计财务管理考前冲刺模拟试卷B卷含答案
- 2025年互联网医疗美容行业产业链优化评估报告
- 2025年互联网数据中心数据中心存储架构建设初步设计评估报告
- 2025年互联网金融平台用户信任建立与金融科技应用策略分析
- 2025年互联网金融平台用户信任度提升的金融风险管理策略研究报告
- 数据结构与算法(C++语言版)课件 第1章 数据结构简介
- 3种检验方案在阴道细菌中的应用对比观察分析研究 临床医学专业
- 电话礼仪的题目及答案
- 电工安全的试题及答案
- 机电工程2025年技术经济学试题及答案
- 辽宁邮政招聘笔试题库2025
- 2025年粮食仓储行业调研分析报告
- 2025年“巴渝工匠”杯职业技能竞赛(调饮师赛项)备赛试题库(含答案)
- 2025辽宁沈阳副食集团所属企业招聘25人笔试参考题库附带答案详解
- 2024-2025新入员工安全培训考试试题及参考答案(达标题)
- 2025陕西中考:历史必背知识点
- 《电力设施保护》课件
- 《人工智能应用基础》 完整课件(共十个模块-上)
- 国企财务测试题及答案
- 死亡报卡培训试题及答案
评论
0/150
提交评论