我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux C Socket Api是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux C Socket Api是什么

本文小编为大家详细介绍“Linux C Socket Api是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux C Socket Api是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

UNIX 环境高级编程对 Socket 通信的描述是套接字网络 IPC( 进程间通信 ) ,可以用于计算机间通信也可用于计算机内通信,管道、消息队列、信号量以及共享内存等都是属于计算机内通信的情况。

套接字Api详细介绍

1.套接字描述符

首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。

套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。

include  <sys/socket.h>

int  socket (int domain, int type, int protocal);返回值:成功返回文件(套接字)描述符,出错返回-1

参数 domain( 域 ) 确定通信的特性,包括地址格式。各个域都有自己的格式表示地址,表示各个域的常数都以 AF_开头,意指地址族 (address family).

参数type确定套接字的类型,进一步确定通信特征。下图给出了一些类型,但在实现中可以自由增加对其他类型的支持。

参数protocol通常是 0 ,表示按给定的域和套接字类型选择默认的协议。当对同一域和套接字类型支持多个协议时,可以使用 proticol 参数选择一个特定协议。在 A_FINET 通信域中套接字类型 SOCK_STREAM 的默认协议是 TCP( 传输控制协议 ) ; A_FINET 通信域中套接字类型 SOCK_DGRAM 的默认协议是 UDP( 用户数据报协议 ) 。

字节流(SOCK_STREAM)要求在交换数据之前,在本地套接字和远程套接字之间建立一个逻辑联系。

Tcp : 没有报文界限,提供的是字节流服务 。之前写过 Qt 传输图片的拆包与解包,原因就是如此吧。

调用socket与调用 open 类型,均可获得用于输入、输出的文件描述符。不用的时候记得 close 关闭。

2.寻址

如何确定一个目标通信进程?

进程的标识有两个部分:计算机的网络地址可以确定网络上与之想要通信的计算机

服务可以确定计算机上的特定进程。

2.1 字节序

在同一台计算机上进程间通信时,一般无需考虑字节序。

TCP/IP协议栈使用大端字节序。有关字节序大家可自行百度。

Linux系统是小端字节序。

2.2 地址格式

地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。为使不同格式的地址能够被传入到套接字函数,地址被强转换成通用的地址结构sockaddr表示。

Linux中,sockaddr_in定义如下;

struct sockaddr_in {sa_family_t     sin_family;in_port_t           sin_port;struct  in_addr     sin_addr;unsigned char       sin_zero[8];};

其中成员sin_zero为填充字段,必须全部置0. 所以在网上搜到的例子有使用bzero.

我目前使用的ubuntu定义如下:

/ Structure describing an Internet socket address.  /struct sockaddr_in{__SOCKADDRCOMMON (sin);in_port_t sin_port;         / Port number.  /struct in_addr sin_addr;        / Internet address.  /

    unsigned char sin_zero[sizeof (struct sockaddr) -               __SOCKADDR_COMMON_SIZE -               sizeof (in_port_t) -               sizeof (struct in_addr)];  };

还有很多关于地址查询的函数,这里就不一一列举了。

3. 将套接字与地址绑定

使用bind函数将地址绑定到一个套接字上。

include  <sys/socket.h>

int bind(int  sockfd, const struct sockaddr * addr, socklen_t  len);返回值:成功返回0,出错返回-1

参数socklen_t使用sizeof来计算就好了。

对于使用地址的一些限制:

端口号不能小于1024,除非该进程具有相应的特权(即为超级用户)。可见规则总是因人而异,计算机也是如此~

对于因特网域,如果指定IP地址为ADDR_ANY,套接字端点可以被绑定到所有的系统网络接口。

注意: linuxman命令可以查看api的详细说明,而且还有例子,也挺不错的。

4. 建立连接

1> connect

如果处理的是面向连接的网络服务(SOCK_STREAMSOCK_SEQPACKET),在开始交换数据前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。使用connect.

include  <sys/socket.h>

int connect(int  sockfd, const struct sockaddr  *addr,  socklen_t  len);返回值:成功返回0,出错返回-1

诶,这个参数好熟悉呀,和bind函数的参数一模一样呀~

client连接server时,由于一些原因,连接可能会失败。可以使用指数补偿的算法解决,了解一下即可。

2> listen

server调用listen来宣告可以接受连接请求:

include  <sys/socket.h>

Int listen(int  sockfd, int  backlog);返回值:成功返回0,出错返回-1

参数backlog提供了一个提示,用于表示该进程所要入队的连接请求数量。其值由系统决定,但上限由<sys/socket.h>SOMAXCONN指定。

一旦队列满,系统会拒绝多余的连接请求。

3> accept

一旦服务器调用了listen,套接字就能接收连接请求。使用函数accept获得连接请求并建立连接。

include  <sys/socket.h>

Int accept(int sockfd,  struct sockaddr *restrict  addr, socklen_t *restrict  len);返回值:成功返回文件(套接字)描述符,出错返回-1

函数accept所返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族。传给accept的原始套接字没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。

如果不关心客户端标识,可以将addrlen设置为NULL,否则addr存放的是连接的客户端的地址。

如果没有连接请求等待处理,accept会阻塞直到有请求到来。另外server可以使用pollselect来等待一个请求的到来。

5. 数据传输

既然将套接字端点表示为文件描述符,那么只要建立连接,就可以使用readwrite来通过套接字通信。readwrite函数我几乎不用,了解一下即可。

1> send

include  <sys/socket.h>

Int send(int sockfd,  const void *buf,  size_t  nbytes,  int  flags);返回值:成功返回发送的字节数,出错返回-1

注意:如果send成功返回,并不一定并表示连接的另一端的进程接收数据。可以保证的是数据已经无误的发送到网络上。

标志我一直用的是0

2> recv

include  <sys/socket.h>

int recv(int sockfd,  const void *buf,  size_t  nbytes,  int  flags);返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,         出错返回-1

仍然一直是0

如果想定位发送者,可以使用recvfrom来得到数据发送者的源地址。

3> recvfrom

include  <sys/socket.h>

int recv(int sockfd,  void *restrict buf, size_t len, int flag, struct sockaddr *restrict  addr, socklen_t *restrict  len);返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,         出错返回-1

因为可以获得发送者的地址,recvfrom通常用于无连接套接字。否则,recvfrom等同于recv

读到这里,这篇“Linux C Socket Api是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux C Socket Api是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux C Socket Api是什么

本文小编为大家详细介绍“Linux C Socket Api是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux C Socket Api是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。UNIX
2023-06-27

C#的Raw Socket是什么

本篇内容主要讲解“C#的Raw Socket是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#的Raw Socket是什么”吧!谈起C# Raw Socket编程,大家也许会想起QQ和IE
2023-06-17

C++的socket封装方法是什么

本篇内容介绍了“C++的socket封装方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.配置QT下的pro文件TEMPLATE
2023-06-04

C++ socket网络编程方法是什么

本篇内容主要讲解“C++ socket网络编程方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ socket网络编程方法是什么”吧!功能完成Cpp客户端简单功能,可收发数据。源码#
2023-06-25

C#中Socket网络通信类是什么

这篇文章主要介绍了C#中Socket网络通信类是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。摘要之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通
2023-06-29

python socket是什么

这篇文章主要讲解了“python socket是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python socket是什么”吧!socket起源于Unix,而Unix/Linux基本
2023-06-27

什么是socket编程

socket编程是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁,使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。一、socket编程简介所谓socket通常也
2023-07-10

unix的socket是什么

unix的socket是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。起因:大平在进行unix运维的时候,总是发现后缀是sock的文件,因此想,这是啥文件呢
2023-06-06

TCP socket和web socket的区别是什么

TCP socket和web socket的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先我们来阅读这段有166个赞的回答:When you send byt
2023-06-04

mysql socket指的是什么

这篇“mysql socket指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql socket指的是什么”文
2023-04-07

Java socket通信与C++之间的关系是什么

Java socket通信与C++之间的关系是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。c++builer与Java socket通信是我们在编程中经常用到的,有不少的
2023-06-17

什么是API

这篇文章主要为大家展示了“什么是API”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“什么是API”这篇文章吧。什么是API?我们只要是在进行编程我们就需要不停的设计API。API简单来讲可以是一
2023-06-20

Nginx中unix socket和tcp socket的区别是什么

这篇文章主要介绍“Nginx中unix socket和tcp socket的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nginx中unix socket和tcp socket的区别是什
2022-12-07

Socket慨念指的是什么

Socket慨念指的是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java开发网络软件非常方便和强大,Java的这种力量来源于他独有的一套强大的用于网络的 api,这
2023-06-03

javascript api是什么

JavaScript API是一组编程接口,它们允许开发人员在JavaScript中处理各种任务。JavaScript API在web开发中更为常见。它们被用于打造动态网站,尤其是Web 2.0应用程序。JavaScript API是一组可以用于设计和改变互联网内容的JavaScript函数和脚本。JavaScript API可以用来操纵HTML元素,从而在网页上改变视觉效果。
2023-05-14

java api 是什么

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。简介运行Java程序时,虚拟机装
java api 是什么
2019-12-15

C# Socket服务的效能是通过什么来衡量的

这篇文章主要介绍“C# Socket服务的效能是通过什么来衡量的”,在日常操作中,相信很多人在C# Socket服务的效能是通过什么来衡量的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# Socket服务
2023-06-17

C/C++ 原生API实现线程池的方法是什么

本篇内容主要讲解“C/C++ 原生API实现线程池的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++ 原生API实现线程池的方法是什么”吧!线程池有两个核心的概念,一个是任务队
2023-06-25

mysql中socket的作用是什么

在MySQL中,socket是一种用于连接数据库的通信协议。当客户端程序连接到MySQL服务器时,它们通过socket进行通信。Socket是一种在网络上进行数据传输的通用技朶,它允许客户端和服务器之间进行双向通信,并且可以保持连接状态。在
mysql中socket的作用是什么
2024-03-15

Java中的Socket用法是什么

Java中的Socket用法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 问题引入1.1 网络架构模型网络架构模型主要有OSI参考模型和TCP/IP五层模型1.1.1
2023-06-22

编程热搜

目录