【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

BSD Socket网络编程API

创建socket对象

int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符,失败返回-1.

参数1:socket对象使用的地址簇或协议簇

       

   常用的有PF_LOCAL(本机通信)、PF_INET(IPv4协议簇)、PF_INET6(IPv6协议簇)

参数2:socket的类型。共有六种。常见有:面向连接的数据流方式;面向无连接的数据报方式

参数3:标识采用哪一种协议,0表示默认。

 

绑定本地IP地址与端口

int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) :成功返回0,失败返回-1

参数1:用于绑定本地IP的文件描述符

参数2:指向sockaddr结构的指针,标识本地地址信息。如果是IP地址,要求IP地址必须为本机IP地址,端口必须为一个未占用的本地端口。

sockaddr数据结构定义如下:

#define __CONST_SOCKADDR_ARG __const struct sockaddr *
struct sockaddr {sa_family_t sa_family;  //协议簇char sa_data[14];       //协议地址
};

sockaddr只提供地址类型规范,根据不同,需要选用不同的类型。

  如果是UNIX套接字,即本机通信的套接字,socket需要与本地socket文件绑定。

#define __SOCKADDR_COMMON(sa_prefix)  sa_family_t sa_prefix##family  //##为宏连接
struct sockaddr_un
{_SOCKADDR_COMMON (sun_);       //协议AF_UNIXchar sun_path[108];            //文件路径名  不能与系统文件名冲突 使用完后删除
};

  IPV4网络通信,sockaddr的结构体应选用下面定义:

struct sockaddr_in
{__SOCKADDR_COMMON(sin_);       //协议AF_INETin_port_t sin_port;            //端口号struct in_addr sin_addr;       //IP地址unsigned char sin_zero[sizeof(struct sockaddr) - _SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; //预留位 以适应struct sockaddr位
};

    其中IP地址的结构体定义为:

struct in_addr{__u32 s_addr;
};

参数3:绑定的地址长度,一般sizeof求得。因为有多种地址类型。

 

监听网络

int listen (int __fd, int __n)  成功返回0,失败返回-1。

参数1:绑定了IP及端口的socket文件描述符

参数2:请求排队的最大长度。

 

客户端发起连接

int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) 成功返回0,失败返回-1.

参数1:socket文件描述符

参数2:连接的目的主机地址(包括IP地址和端口)

参数3:该地址长度

 

服务器接收连接

int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)  在监听到客户端连接请求时通过该函数接收,未监听到时阻塞。成功返回新的文件描述符,失败返回-1.

参数1:socket文件描述符

参数2:stuct sockaddr类型的地址空间首地址

参数3:该段地址空间的长度

服务器通过源IP、源端口、目的IP、目的端口来区分某个连接

 

读/写socket对象:默认以阻塞方式进行

ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur  读文件内容

ssize_t write (int __fd, __const void *__buf, size_t __n) __wur 写文件内容

 

TCP发送/接收数据

ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags) :发送数据。当第4个参数为0时与调用write一样。成功返回发送数据大小,失败返回-1.

ssize_t recv (int __fd, void *__buf, size_t __n, int __flags) :接收数据。 成功返回接收数据大小,失败返回-1.

参数1:目标socket对象

参数2:欲发送/接收的数据位置

参数3:欲发送/接收的数据大小

参数4:说明数据处理方式。如下图:

 

关闭socket对象

int close (int __fd) : 会关闭读写通道

int shutdown (int __fd, int __how) :有三种关闭方式。

  • howto = 0 :关闭读通道
  • howto = 1 :关闭写通道
  • howto = 2 :完全关闭读写通道

 

获取socket本地/对端信息

int getsocketname (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得一个套接字的本地地址。成功0,失败-1.

int getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得已经连接上的套接字的远程信息,如IP地址和端口

 

转载于:https://www.cnblogs.com/dplearning/p/4693176.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库中有痣但是有时取不到_农村这种长得像“泥鳅”的鱼,以前没人吃,现在可能有钱都吃不到...

只说真话的农民公众号原创文章,严禁转载在农村中有很多不能叫出名字的花草和野味,它们当中虽然有些长得比较奇怪,名字也比较奇怪,但是却是非常好的疗补食物。有些花草是治疗疾病的良药,有些野味现在也被搬上了酒桌。但…

简述计算机的英语作文,初中计算机的英语作文

初中计算机的英语作文发布时间:2020-04-07在过去的时间里,计算机得到了很大的改进。下面是小编为大家精心整理的关于初中计算机的英语作文,希望能够帮助到你们。The ComputerThe computer is widely used in all phases of society. In indus…

(第三天)函数

定义函数 关键字function用来定义函数。定义函数有两种方法 (1)函数定义表达式 1 var f function(x) { return x1; } (2)函数声明语句 1 function funcname([arg1 [, arg2 [...,argn]]]) { 2 3 } 函数声明语句通常出现在JavaScr…

python 使用 asyncio 包处理并发

文章目录1. 线程与协程对比2. 使用 asyncio 和 aiohttp 下载3. 避免阻塞型调用4. 使用 asyncio.as_completed5. 使用Executor对象,防止阻塞事件循环6. 从回调到期物和协程learn from 《流畅的python》 1. 线程与协程对比 threading import threading import iter…

ai预测占比_2019-2021年中国AI芯片市场预测与展望数据

来源:雪球App,作者: IC咖啡,(https://xueqiu.com/1118999957/139121699)预计未来三年AI芯片市场规模仍将保持50%以上的增长速度,到2019年中国AI芯片市场规模将达到124.1亿元。从细分市场结构来看,云端训练芯…

计算机专业英语第2版郭涛翻译,计算机专业英语

计算机专业英语作  者:郭涛 主编出版时间:2007年01月定  价:21.60I S B N :9787560939209所属分类: 大中专教材 > 研究生/本科/专科教材 &nbsp大中专教材 &nbsp语言学习 > 大学英语 &nbsp语…

ODS与数据仓库

数据仓库是目前主要的数据存储体系。数据仓库之增W.H.Inmon认为,数据仓库是指支持管理决策过程的、面向主题的、集成的、随时间而变的、持久的数据的集合。简单地说,一个数据仓库就一个自数据库的商业应用系统,该数据库的数据来自于其它的运作…

LeetCode 1991. 找到数组的中间位置(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。 中间位置 middleIndex 是满足 nums[0] nums[1] ... nums[middleIndex-1] n…

mysq命令行导出sql_mysql 命令行导入导出 sql

命令行source 导入数据库:代码如下复制代码1,将要导入的.sql文件移至bin文件下,这样的路径比较方便2,同上面导出的第1步3,进入MySQL:mysql -u 用户名 -p如我输入的命令行:mysql -u root -p (输入同样后会…

计算机应用基础第六章,《计算机应用基础》第六章习题

周南岳版第六章习题及答案《计算机应用基础》教材第6章习题一、填空题(1)计算机网络中共享资源指的是硬件、软件和___数据___资源。(2)计算机网络中,通信双方必须共同遵守的规则或约定,称为__协议__。(3)在计算机局域网中,将计算机连接到网络…

discuz MVC结构分析

Discuz软件经解压后产生的三个文件夹中的一个叫upload的成为网站的根目录。里面的内容可以在某些网站上在线阅读,如用好库编程网。也可以离线在本地阅读,如用VS.Php for Visual Studio。这里面的内容安排的井然有序。不同用途的文件都放在了不同的文件夹…

postforobject 设置代理_Spring RestTemplate和代理身份验证

小编典典经过许多不同的选择之后,由于能够在创建时为RestTemplate设置代理,因此我可以选择以下代码,因此我可以将其重构为单独的方法。只是要注意,它还具有其他依赖性,因此请记住这一点。private RestTemplate createR…

LeetCode 1992. 找到所有的农场组(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始,大小为 m x n 的二进制矩阵 land ,其中 0 表示一单位的森林土地,1 表示一单位的农场土地。 为了让农场保持有序,农场土地之间以矩形的 农场组 的形式存在。 每一个农场组都…

flash html5 chrome,为了支持 HTML5 ,谷歌 Chrome 浏览器将“封杀”Flash

关于谷歌 Chrome 将不再支持 Flash 的话题,已经争论了很长一段时间了。不过现在,这家互联网巨头终于确认,为了支持 HTML5,Chrome 浏览器将不再运行 Flash。据谷歌表示,由于 Flash 会减慢网页浏览速度并可能引发信息安全…

VS2015开发Android,自带模拟器无法调试、加载程序,算是坑吗

VS2015出来后,确定变化很大,什么android、ios的,不在话下。对于我这样传统型的人,也第一时间试用了一下(vs2003->vs2008->vs2012->vs2015)。以前用eclipse开发过android小程序,现在想试…

amd cpu 安卓模拟器_夜神模拟器常见问题解答_v20201025

MAC版本常见问题Mac版本模拟器常见问题MAC模拟器出现“您应该将它移到废纸篓”解决办法MAC版本模拟器功能介绍MAC版本模拟器界面Mac版模拟器可能无法启动(卡99%)的原因及解决方式其他问题如何在夜神模拟器中安装自己想要的游戏/应用Sample CA 2证书没网解决办法GlobalSignature…

LeetCode 502. IPO(优先队列)

文章目录1. 题目2. 解题1. 题目 假设 力扣(LeetCode)即将开始 IPO 。 为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。 帮助…

计算机水平考试ppt试卷,计算机等级考试一级笔试卷库.ppt

计算机等级考试一级笔试卷库计算机等级考试一级笔试题库 全国计算机等级考试一级题库 1.微机中1K字节表示的二进制位数是( )。? A、1000 B、8x 1000 C、1024 D、8x1024?? 2.计算机硬件能直接识别和执行的只有( )。 A、高级语言 B、符号语言 C、汇编语…

mysql中ibatis的limit动态传参

param.put("pageNo",pageNo); param.put("pageSize",pageSize); sqlMap中的用法 limit ${pageNo},${pageSize} 我今天在敲代码的时候这么用结果就报错了:limit #pageNo#,#pageSize# 后来查资料才知道 limit 后面不应该用#(我传进来的是Intege…

牛客网软通动力软件测试机试_软通动力软件测试笔试题

.;.1.软件测试是软件开发的重要环节,进行软件测试的目的是()A)证明软件错误不存在B)证明软件错误的存在C)改正程序所有的错误D)发现程序所有的错误2.对于软件质量描述不正确的是:()A)高质量的过程产生高质量的产品B)软件质量是测试…