【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,一经查实,立即删除!

相关文章

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

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

python 使用 asyncio 包处理并发

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

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

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

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

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

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 个不同的项目。 帮助…

bash 不是内部或外部命令_Win10_cmd下提示:‘xxx’不是内部或外部命令,也不是可运行的程序 或批处理文件...

一、windows下命令行查看ip: win+R,调出【运行】,输入cmd,回车打开终端,输入ipconfig,查看成功: 二、可能出现的问题: ping 不是内部或外部命令,也不是可运行的程序或批处理文件。 ipconfig 不是内部或外部命令,也不是可运行的程序或批处理文件。 解决: 1、控制面板…

python 属性描述符

文章目录1. 描述符示例:验证属性2. 自动获取储存属性的名称3. 继承改进4. 覆盖型与非覆盖型描述符对比4.1 覆盖型描述符4.2 没有 __get__ 方法的覆盖型描述符4.3 非覆盖型描述符4.4 在类中覆盖描述符5. 描述符用法建议learn from 《流畅的python》 1. 描述符示例&a…

计算机声音与视频教程,电脑怎么录屏幕视频带声音 电脑录屏幕视频带声音教程...

电脑怎么录屏幕视频带声音,相信有许多的用户在工作上或者学习上也会有这种需求,自己对此也还是不太的了解,毕竟也是没有怎么使用过,对此也是想要知道这电脑怎么录屏幕视频带声音,其实也是有几个原因,下面就…

tensor转换为图片_为大家介绍图片转换pdf的经验总结!你找对方法了吗?

图片转换pdf怎么做?不少朋友们在学习和工作中都发现了PDF这种文件格式似乎格外的吃香,你收到的很多培训文件和在网上搜罗的一些学习文件,全部都是PDF格式,PDF格式这么吃香?甚至有人让你把图片都转成PDF格式&#xff0c…

LeetCode 2021 力扣杯全国秋季编程大赛(第384名)

文章目录1. 无人机方阵2. 心算挑战3. 黑白翻转棋4. 玩具套圈5. 十字路口的交通2021.9.11,周六比赛之前:早上去交大看看,本科毕业10年了,由于限流,校园里没有多少回校的校友。逛了逛,跟太太和的她的同学一起…

java 画笔跟swing组件_Java学习教程(基础)--Java版本历史(二)

Java语言自JDK1.0版本以来经历了许多次更新,也在基本程序库中增加了大量的类别和包。从J2SE 1.4开始,Java语言的变动由 Java Community Process(JCP)管理,JCP使用Java规范请求(Java Specification Requests…

计算机网络路由选择协议,IP路由选择协议原理和作用

IP路由选择协议原理和作用(2008-10-20 19:26:17)标签:杂谈IP路由选择如果目的主机与源主机直接相连或都在一个共享网络上,那就直接把包发送到目的主机,如果不是,那把ip数据报送到默认路由器,由它转发路由器使用路由表保存自己知道的网络的信息,它包括:目的IP地址,它…

LeetCode 2000. 反转单词前缀

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 word 和一个字符 ch 。 找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。 如果 word 中不存在字符 ch ,则无需进…

oss图片跨域问题_图片存储解决方案-阿里云对象存储

开通对象存储OSS1. 打开阿里云官网,选择产品对象存储 OSS 2.开通对象存储OSS 需要支付宝扫码登录3.进入管理控制台 4.新建存储空间 5.跨域资源共享(CORS)的设置管理文件整合Springboot实现图片上传服务端签名直传并设置上传回调 : 在服务端完成签名,并且…

2015-8-10工作日志

1. 工作规划:完成系统请假管理的功能。 (1)根据系统需求完成请假管理model; (2)进行请假流程的deployment; (3)进行请假流程的流程定义管理; (4&a…

LeetCode 2001. 可互换矩形的组数

文章目录1. 题目2. 解题1. 题目 用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形&#xff0c;其中 rectangles[i] [widthi, heighti] 表示第 i 个矩形的宽度和高度。 如果两个矩形 i 和 j&#xff08;i < j&#xff09;的宽高比相同&#xff0c;则认为这两…

google 浏览器默认打开控制台_前端开发调试:浏览器console方法总结

今天突发奇想&#xff0c;准备总结下console的各个函数。以前都是只用一个console.log(),查了一下发现有好多&#xff0c;就记下来&#xff0c;方便以后查阅。速记consoleConsole对象提供浏览器控制台的接入&#xff0c;不同浏览器是不一样的&#xff0c;这里介绍普遍存在的Con…

江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...

大家好&#xff0c;我是古小一&#xff0c;一个行走在酒水品牌包装设计不归路上的小编&#xff01;当下品牌间的跨界合作越来越多&#xff0c;消费者不但有审美疲劳的趋势&#xff0c;脑洞过大的跨界还容易引发群嘲。不过好在有热情网友的帮助&#xff0c;雪碧与江小白已经自然…