首页 > 系统相关 >Linux网络通信基础API

Linux网络通信基础API

时间:2024-08-13 14:59:16浏览次数:12  
标签:网络通信 socket int 地址 API Linux sockfd include 连接

这篇文章只有Linux网络通信基础API大参数信息,和返回值,这篇文章并没有这些基础API的参数类型介绍。accept的第二个参数可以查看客户端信息。

创建socket

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

该函数可以创建一个socket;

参数:

domain:告诉系统使用那个底层协议。对TCP/IP协议族而言,该参数应该设置为PF_INET(用于IPv4)或PF_INET6(用于IPv6);对于UNIX本地协议族而言,应设为PF_UNIX。

type:指定服务类型。主要有SOCK_STREAM服务(流服务)TCP和SOCK_UGRAM(数据报)服务UDP,并且高版本Linux,支持SOCK_NONBLOCK和SOCK_CLOEXEC分别表示将新创建的socket设为非阻塞,以及用fork调用创建子进程时在子进程内部关闭该socket

protocol:几乎所有情况都将其设置为0,表示使用默认协议。

返回值:

        socket系统调用成功返回一个socket文件描述符,失败返回-1并设置errno。

命名socket(绑定)

        创建socket时,只给它指定了地址族,但并未指定使用该地址族中的哪个具体socket地址

        将一个socket与socket地址绑定成为给socket命名,因为只有命名后,客户端才知道该如何连接它。客户端通常不需要命名socket,都是匿名方式,即操作系统自动分配socket地址。

命名socket的系统调用
 

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

参数:

sockfd:就是socket()创建的文件描述符

addr:bind将addr所指的socket地址分配给未命名的sockfd文件描述符

addrlen:指socket地址长度

返回值: 

        成功返回0,失败返回-1并设置errno。常见的两种错误,EACCES和EADDRINUSE

        EACCES:被绑定的地址是保护地址,仅由超级用户可以访问。比如端口号(0~1023).

        EADDRINUSE:被绑定的地址正在使用。比如将socket绑定到一个处于TIME_WAIT状态的socket地址。

监听socket

        socket被命名之后,还不能马上接收客户连接,我们需要如下系统调用来创建一个监听队列,以存放待处理的客户连接。

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

 参数:

sockfd:指定被监听的socket。

backlog:提示内核监听队列的最大长度,监听队列如果超过backlog,服务器将不受理新的客户连接,客户端也将收到ECONNREFUSED错误信息。在内核版本2.2之后,只表示处于完全连接状态的socket的上限,半连接状态则由内核参数定义。典型值为5.

返回值:

        成功返回0,失败返回-1并设置errno。 

接受socket

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

从listen监听队列中接受一个连接。

参数:

sockfd:执行过listen系统调用的监听队列socket。

 addr用来获取被接受连接的远端socket地址,如客户端连接,服务端接受,就可以通过这个参数获取。

addrlen:指定socket地址长度。

返回值:

        成功返回一个新的socket连接,该socket唯一标识了被接受的这个连接,服务端可通过读写socket来与被接受连接的客户端进行通信。失败返回-1并设置errno。

发起socket

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

客户端主动与服务器建立连接。

参数:

sockfd:参数socket()创建的文件描述符。

addr:是服务器监听的socket地址

addrlen:指定地址长度

返回值:

        成功返回0,一旦成功建立连接,socket就唯一地标识了这个连接,客户端就可以通过sockfd来与服务端通信。失败返回-1,并设置errno。常见的两个错误:ECONNREFUSED和ETIMEDOUT。

         ECONNREFUSED:目标端口不存在,连接被拒绝。

        ETIMEDOUT:连接超时。

关闭socket

       #include <unistd.h>

       int close(int fd);

        参数fd是待关闭状态,close系统调用并非总是立即关闭一个连接,而是通过fd引用计数减一,当fd引用计数减为0,才真正关闭连接多进程,一次fork()将父进程中代开的socket的引用计数加1,因此我们必须在父子进程中都进行关闭,才能真正关闭。 

标签:网络通信,socket,int,地址,API,Linux,sockfd,include,连接
From: https://blog.csdn.net/2201_75324712/article/details/141137801

相关文章

  • linux kill指令
    1、语法kill[options]<PID>[options]-l:列出所有可用的信号。-:发送特定的信号给目标进程,如-9表示发送KILL信号,即强制终止进程。是要终止进程的进程ID。2、列出所有可用信号[root@localhost~]#kill-l1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP......
  • 600条Linux 命令总结
    一、基本命令uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读取操作系统信息arch显示机器的处理器架构uname-m显示机......
  • VF01/VF02/VF03屏幕增强及BAPI增强字段处理
    1.在销售发票抬头表中增加增强字段2.创建处理程序主程序SAPMV60A中的所有包含文件都是以MV60AF打头的,所以我们创建一个独立的程序SE38(ZSDU0001) 来存放所有的处理代码 创建屏幕9001,确保屏幕类型为子屏幕 屏幕字段可从VBRK表中获取*&---------------------------......
  • Alpine Linux下同时绑定DHCP与静态地址
    官方教程:https://wiki.alpinelinux.org/wiki/Configure_NetworkingAlpine官方文档只介绍了如何给网卡设置动态或者静态地址,没有提及两者兼顾。使用主机进行测试,可同时实现dhcp与静态地址共存。注意:这里绑定的是唯一本地地址,可内部自由分配保证网内唯一即可。ipv6各类地址介绍......
  • 【零基础必看的Linux教程】——Linux 安装(CentOs)
    本章节我们将为大家介绍Linux的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用。本教程以centos6.4为例。给大家附上centos下载地址:centos下载地址https://www.centos.org/download/以下针对各个版本的ISO镜像文......
  • 用 Python示例,怎么利用电商api来制定营销策略!
    以下是一个更完整的示例代码,用于使用电商API数据来制定营销策略。在这个示例中,我们不仅获取最畅销的商品,还获取不同价格段的销售分布,以制定更全面的营销策略:importrequestsimportjson#假设这是获取商品销售数据的API端点api_endpoint="https://example-ecommerce-......
  • C 提高篇 c运行库、c标准库、windows API的区别和联系
    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身......
  • 【nohup】【Linux】多个nohup同时跑报错
    多个nohup同时跑报错在使用Linux系统进行多任务处理时,nohup命令是一个非常有用的工具,它可以让命令在后台运行,即使终端关闭也不会影响到程序的执行,当尝试同时运行多个nohup命令时,可能会遇到一些错误,以下是对可能出现的问题的分析和解决方案。 需要了解nohup的工作原理。nohu......
  • PostgreSQL Linux下安装与配置
    1.PostgreSQL安装Linux版本这里使用的是7.x版本,最好是7.6或者7.8。下载地址:https://www.postgresql.org/download/选择好PGSQL的版本,Linux的发行版本直接执行命令即可:#下载PGSQL的rpm包sudoyuminstall-yhttps://download.postgresql.org/pub/repos/yum/reporp......
  • apifox进行https接口测试
    SSL双向认证-SpringBoot项目_apifox添加证书-CSDN博客说是SSL证书验证开启,可能验证不通过,根据实际情况来单向认证,客户端证书就不必上传了注:这里我上传的是p12证书,所以选择下图所示上传另外,这里用的是rsa2048,SM2试了,貌似有问题,如果只是简单的get,可以考虑用奇安信等支持......