当前位置: 首页 > news >正文

socket API(linux)

1.socket函数

 (1)定义

   作用:创建socket

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

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

(2)参数

  • domain

    设置网络通信域,即通信的协议设置:

名称含义
 AF_UNIX, AF_LOCAL本地通信
AF_INETIPv4 Internet协议
AF_INET6IPv6 Internet协议
AF_IPXIPX-Novell协议
AF_NETLINK内核用户界面设备
AF_X25ITU-T X25 / ISO-8208协议
AF_AX25Amateur radio AX.25
AF_ATMPVC原始ATM PVC访问
AF_APPLETALKAppletalk
AF_PACKET底层包访问
AF_ALG内核加密API
  • type

     参数type用于设置套接字通信的类型:

名称含义
SOCK_STREAMTCP连接(提供序列化的、可靠的、双向连接的字节流,支持带外数据传输)
SOCK_DGRAMUDP连接(无连接状态、不可靠的报文)
SOCK_SEQPACKET序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出
SOCK_RAWRAW类型,提供原始网络协议访问
SOCK_RDM提供可靠的数据报文,不过可能数据会有乱序
  • protocol

    用于制定某个协议的特定类型.

  例如创建一个流式的socket:

int fd = socket(AF_INET, SOCK_STREAM, 0);

(3)返回值

    返回值中fd>0代表创建成功,此时fd的值就是创建文件描述符的值;fd = -1表示创建失败,可以通过errno来查看具体失败原因。

errno值含义
EACCES没有权限建立制定的domain的type的socket

EAFNOSUPPORT

不支持所给的地址类型
EINVAL不支持此协议或者协议不可用
EMFILE进程文件表溢出

ENOBUFS or ENOMEM

内存不足,socket只有到资源足够或者有进程释放内存

EPROTONOSUPPORT

制定的协议type在domain中不存在

2.bind函数

(1)定义

作用:套接字与一个地址相关联,即地址绑定。

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

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

(2)参数

  • sockfd

    上一步socket创建的返回值fd(前提创建成功了)

  • sockaddr

       sockaddr结构体定义如下:

struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
           }

 这个数据结构逐渐被舍弃(参考:https://blog.csdn.net/ZWE7616175/article/details/80252048)

代替的是:struct sockaddr_in,在使用的时候需要把第二个结构强转成sockaddr

struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;                 /* Port number.  */
    struct in_addr sin_addr;            /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
  };

上面的不太直观,翻译一下:

struct sockaddr_in { 
   uint8_t sa_len;   /* 结构体长度*/ 
     short int sin_family; /* 通信类型 */ 
   unsigned short int sin_port; /* 端口 */ 
   struct in_addr sin_addr; /* Internet 地址 */ 
   unsigned char sin_zero[8]; /* 未使用的*/ 
   };

struct in_addr {   //sin_addr的结构体类型in_addr 原型
   unsigned long s_addr;     /*存4字节的 IP 地址(使用网络字节顺序)。*/
   };
  • sddrlen

    addr结构的长度。

(3)返回值

    返回值为0时表示绑定成功,-1表示绑定失败,errno的错误值:

errno值含义
EACCES地址被保护,用户的权限不足
EADDRINUSE给定地址已经使用
EBADFsockfd不合法
EINVALsockfd已经绑定到其他地址

ENOTSOCK

描述符不是socket描述符

EADDRNOTAVAIL

接口不存在或者绑定地址不是本地
EFAULTaddr指针超出用户空间
ELOOP解析addr时符号链接过多

ENAMETOOLONG

addr过长
ENOENT文件不存在
ENOMEM内核内存不够

ENOTDIR

不是目录
EROFS只读

 例如:

    struct sockaddr_in bindaddr;
    bindaddr.sin_family = AF_INET;
    bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    bindaddr.sin_port = htons(8080);
    if (bind(fd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1)
    {
        pinttf("bind failed!\n"); 
        return -1;
    }

3.listen

(1)定义:listen()函数将sockfd标记为被动打开的套接字(即变为监听状态),并作为accept的参数用来接收到达的连接请求。

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

 int listen(int sockfd, int backlog);

(2)参数:

  • sockfd

    socket类型的文件描述符。

  • backlog

    用来描述sockfd的等待连接队列能够达到的最大值。

(3)返回值

    返回值为0时表示成功,-1表示失败,errno的错误值:

errno值含义

EADDRINUSE

另一个套接字已经绑定在相同的端口上
EBADFsockfd不是有效的文件描述符
ENOTSOCKsockfd不是套接字

EOPNOTSUPP

sockfd不是支持listen操作的套接字类型

4.connect

(1)定义

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

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

(2)参数

  • sockfd

    套接字文件描述符

  • sockaddr

    参照struct sockaddr_in(目的地址的IP和端口信息)

  • addrlen

    填sizeof(struct sockaddr_in)

(3)返回值

    返回值为0时表示成功,-1表示失败,errno的错误值:

errno值含义
EACCES没有权限建立制定的domain的type的socket
EBADF无效的socket文件描述符
EISCONN已经连接过了
ETIMEDOUT超时

5.accept

(1)定义:

   尝试接收一个连接

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

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

 #define _GNU_SOURCE             /* See feature_test_macros(7) */
 #include <sys/socket.h>

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

(2)参数

  •   sockfd

    socket类型的文件描述符

  • sockaddr

    参照struct sockaddr_in

(3)返回值

   成功时,返回非负整数,该整数是接收到套接字的描述符;出错时,返回-1,相应地设定全局变量errno:

errno值含义
EFAULT 
ENOTSOCK 
EOPNOTSUPP 
EPERM防火墙拒绝此连线
ENOBUFS系统的缓冲内存不足

 

6.send

(1)定义

 #include <sys/types.h>
 #include <sys/socket.h>

 ssize_t send(int sockfd, const void *buf, size_t len, int flags);

(2)参数

  • sockfd

   如果是服务端这个sockfd是accept函数返回的fd

  • buf

    待发送的缓存

  • len

    send指要发送的长度

  • flags

(3)返回值

    返回值>0表示发送的字节数,=0表示对端断开连接,返回-1时:在阻塞模式下为错误,而在非阻塞模式下不一定是错误的,所以要结合errno值来判断。

errno值含义

EAGAIN or EWOULDBLOCK

套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
EINTR操作被信号中断

7.recv

(1)定义

 #include <sys/types.h>
 #include <sys/socket.h>

 ssize_t recv(int sockfd, void *buf, size_t len, int flags);

(2)参数

  • sockfd

    如果是服务端这个sockfd是accept函数返回的fd

  • buf

    待接收的缓存

  • len

    recv指期望接收的长度

  • flags
flags值含义
MSG_DONTWAIT仅本操作非阻塞
MSG_OOB  发送或接收带外数据
MSG_PEEK  窥看外来消息
MSG_WAITALL 等待所有数据

(3)返回值

     返回值>0表示发送的字节数,=0表示对端断开连接,返回-1时:在阻塞模式下为错误,而在非阻塞模式下不一定是错误的,所以要结合errno值来判断。

errno值含义

EAGAIN or EWOULDBLOCK

套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
EINTR操作被信号中断

相关文章:

  • Linux socket编程实战(阻塞)
  • Linux socket编程实战(非阻塞)
  • coredump配置调试
  • Linux I/O复用技术---select
  • log4cpp的使用
  • Linux I/O复用技术---poll
  • Linux I/O复用技术---epoll
  • 网络通信基础知识(tcp/ip)
  • protobuf(C++)的使用(windows)
  • 常用字符串函数的实现
  • 使用宏定义max函数
  • libevent的使用
  • 线程的同步手段
  • 单台百万并发
  • 数据结构与算法知识点
  • ----------
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2017年终总结、随想
  • Apache Pulsar 2.1 重磅发布
  • hadoop集群管理系统搭建规划说明
  • Java IO学习笔记一
  • javascript面向对象之创建对象
  • MYSQL 的 IF 函数
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Objective-C 中关联引用的概念
  • Vue.js源码(2):初探List Rendering
  • vue-router的history模式发布配置
  • vuex 学习笔记 01
  • 阿里云前端周刊 - 第 26 期
  • 复习Javascript专题(四):js中的深浅拷贝
  • 开源地图数据可视化库——mapnik
  • 怎样选择前端框架
  • RDS-Mysql 物理备份恢复到本地数据库上
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 我们雇佣了一只大猴子...
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (14)Hive调优——合并小文件
  • (C语言)二分查找 超详细
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (转)linux下的时间函数使用
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)为C# Windows服务添加安装程序
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • . NET自动找可写目录
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net mvc总结
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计