- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向连接的套接字通信_socket编程
面向连接的套接字通信
1.1? 面向连接的套接字通信工作流程
为了实现服务器与客户机的通信,服务器和客户机都必须建立套接字。服务器与客户机的工作原理可以用下面的过程来描述。
服务器先用socket函数来建立一个套接字,用这个套接字完成通信的监听。
用bind函数来绑定一个端口号和IP地址。因为本地计算机可能有多个网址和IP,每一个IP和端口有多个端口。需要指定一个IP和端口进行监听。
服务器调用listen函数,使服务器的这个端口和IP处于监听状态,等待客户机的连接。
客户机用socket函数建立一个套接字,设定远程IP和端口。
客户机调用connect函数连接远程计算机指定的端口。
服务器用accept函数来接受远程计算机的连接,建立起与客户机之间的通信。
建立连接以后,客户机用write函数向socket中写入数据。也可以用read函数读取服务器发送来的数据。
服务器用read函数读取客户机发送来的数据,也可以用write函数来发送数据。
完成通信以后,用close函数关闭socket连接。
客户机与服务器建立面向连接的套接字进行通信,请求与响应过程可用图来表示。struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
1.1.2 socket函数
为了执行网络I/O,一个进程必须做的第一件事情就是调用socet函数,指定期望的通信协议类型。
参数:其中family参数指明协议族,是下图中的某个常值。该参数也被称为协议域(domain)Type参数指明套接口类型,是下图中的某个常值。
Protocol参数应设为下图所示的某个协议类型常值,或者设为0,以选择所给定的family和type组合和系统缺省值。
protocol 说明 IPPROTO_TCP TCP传输协议 IPPROTO_UDP UDP传输协议 IPPROTO_SCTP SCTP传输协议 1.2? 绑定端口绑定端口指的是将套接字与指定的端口相连。用socket函数建立起一个套接字以后,需要用bind函数在这个套接字上面绑定一个端口。本节将讲解套接字的绑定端口操作。
1.2.1? 绑定端口函数bind
函数bind可以将一个端口绑定到一个已经建立的socket上,这个函数的使用方法如下所示。
参数列表中,sockfd表示已经建立的socket编号,sockaddr是一个指向sockaddr结构体类型的指针。sockaddr的定义方法如下所示。struct sockaddr{unsigned short int sa_family;char sa_data[14];};
这个结构体的成员含义如下所示。
sa_family:为调用socket()时的domain参数,即AF_xxxx值。
sa_data:最多使用14个字符长度,含有IP地址与端口的信息。
如果建立socket时使用的是AF_INET参数,则socketaddr结构体的定义方法如下所示
struct socketaddr_in{unsigned short int sin_family;uint16_t sin_port;struct in_addr sin_addr;unsigned char sin_zero[8];};
结构体的成员in_addr也是一个结构体,定义方式如下所示。struct in_addr{uint32_t s_addr;};
在这些结构体中,成员变量的作用与含义如下所示。
sin_family:即为sa_family,为调用socket()时的domain参数。
sin_port:使用的端口号。
sin_addr.s_addr:IP 地址。
sin_zero:未使用的字段,填充为0。
参数addrlen表示my_addr的长度,可以用sizeof函数来取得。函数可以把指定的IP与端口绑定到已经建立的socket上面。
如果绑定成功,则返回0,失败则返回-1。函数可能发生下面的错误,可以用error捕获发生的错误。
在使用这个函数前,需要在程序的最前面包含下面的头文件。1.2.2? bind函数绑定端口实例
下面的实例使用了bind函数在一个打开的socket上面绑定IP与端口。绑定的端口是5678,IP为INADDR_ANY,表示本地计算机的默认IP地址。
#includesys/types.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.h#includeunistd.h?????????/*包含头文件。*/
#define PORT 5678?????????/*
您可能关注的文档
最近下载
- 金属工艺学 全套课件.ppt VIP
- 外研版(三起)(2024)三年级下册英语Unit 4《What’s your hobby?》第1课时教案 .pdf VIP
- Unit 4 What's your hobby 第三课时教案 2024-2025学年度 外研版英语三年级下册.docx VIP
- 老年患者麻醉管理专家共识.pptx
- 景区运营管理合作协议.doc VIP
- HGT21629-2021管架标准图图集标准.docx VIP
- 保健食品要掌握的全部基本知识【58页】.pptx VIP
- MDCG 2020-7 上市后临床随访 (PMCF) 计划模板中文版.docx VIP
- 基坑土方回填施工策划方案.doc VIP
- 半导体材料课件课件.pptx VIP
文档评论(0)