首页 > 系统相关 >【为项目做准备】Linux网络编程重点知识(项目通用知识)

【为项目做准备】Linux网络编程重点知识(项目通用知识)

时间:2024-09-04 19:54:18浏览次数:14  
标签:setsockopt 编程 函数 int 知识 Linux sockfd 接字 socket

Linux网络编程的简单梳理,不够再来更新~

socket()

socket()函数,用来创建套字节

  1. 头文件:#include <sys/socket.h>
  2. 函数:int socket(int domain, int type, int protocol)
相应参数说明:
- domain:
指定套接字的地址族,常见的AF_INET (IPv4)和 AF_INET6 (IPv6)。

- type:
指定套接字的类型,常见的有 SOCK_STREAM (TCP协议)和 SOCK_DGRAM (UDP协议)。

- protocol:
指定套接字使用的协议,通常为0,表示使用默认协议。默认的协议通常是与给定的域和套接字类型最匹配的协议。

有些域和套接字类型支持多种协议。这时就可以根据protocol参数来确定最终的协议。
例如,在IPv4中,SOCK_STREAM套接字类型支持TCP和SCTP协议,SOCK_DGRAM套接字类型支持UDP和DCCP协议。
如果我们要使用SCTP协议而不是TCP协议来创建一个SOCK_STREAM套接字,则可以将protocol参数设置为IPPROTO_SCTP。

不同操作系统可能支持不同的协议,因此要根据具体的环境来选择正确的协议。
  1. 返回值
    套接字函数,如socket(),bind(),listen()等,其返回值通常是int型。这些函数的返回值表示函数执行的结果或错误代码.
  • 如果成功就返回一个非负的套接字描述符,用于后续的套接字操作。
  • 失败就返回-1,可以通过检查全局变量errno来获取具体错误代码。

setsockopt()

setsockopt()函数,用来设置socket的属性。

  1. 头文件:#include <sys/socket.h>
  2. 函数:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

参数说明:

setsockopt()函数是一个用于设置套接字选项的系统调用函数。它允许应用程序在已打开的套接字上设置各种选项,以控制套接字的行为。

- sockfd:
套接字描述符,之前通过 socket() 函数创建的套接字的文件描述符。

- level:
指定选项所在的协议层。通常的协议层包括SOL_SOCKET(通用套接字选项)、IPPROTO_TCP(TCP协议选项)和IPPROTO_IP(IP协议选项)等。

- optname:
指定要设置的选项名称。这个值取决于 level 参数。例如,对于 SOL_SOCKET,常见的选项包括 SO_REUSEADDR、SO_RCVBUF、SO_SNDBUF 等。

- optval:
指向存储选项值的缓冲区,这个值的类型和大小取决于 optname。

- optlen:
指定选项值的大小,这个值通常是 optval 所指向的数据结构的大小。

常见的选项:

- SO_REUSEADDR:允许重新使用本地地址。
- SO_RCVBUF:设置接收缓冲区的大小。
- SO_SNDBUF:设置发送缓冲区的大小。
- TCP_NODELAY:禁用 Nagle 算法,减少延迟。

使用示例:

  • 创建套接字:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(socket < 0){
	perrpr("socket");
	exit(EXIT_FAILURE);
}
  • 设置接收缓冲区大小
int optval = 4096;//4KB
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, optlen) < 0) {
{
    perror("setsockopt");
    close(sockfd);
    exit(EXIT_FAILURE);
}
  • 获取并打印接收缓冲区大小
if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen) < 0) {
	perror("getsockopt");
	close(sockfd);
	exit(EXIT_FAILURE);
}
printf("Receive buffer size: %d\n", optval);
  • 关闭套接字
close(sockfd);
  • 设置套接字为可重用

这段代码设置了 SO_REUSEADDR 选项,使得套接字可以重新绑定到一个地址,而不需要等待地址释放。这对于服务器程序在关闭后立即重新启动时很有用。

int optval = 1;//通常用来表示布尔值 true,即启用某个选项。
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) //小于 0,表示调用失败
{
    perror("setsockopt failed");
    exit(EXIT_FAILURE);
}
  • 设置接收或发送超时时间:
struct timeval timeout; //timeout 是一个 struct timeval 结构体,用来表示时间。
timeout.tv_sec = 5; //设置为 5,表示超时时间为 5 秒。
timeout.tv_usec = 0; //设置为 0,表示超时时间的微秒部分为 0。
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) 
{
    perror("setsockopt failed");
    exit(EXIT_FAILURE);
}
  1. 返回值
    setsockopt()函数的返回值是一个整数,表示函数执行的结果。如果函数执行成功,则返回值为0;如果函数执行失败,则返回值为-1,并且可以通过检查全局变量errno来获取具体的错误代码。常见的错误代码包括:
  • EBADF:无效的套接字描述符
  • ENOTSOCK:指定文件描述符不是套接字
  • EINVAL:无效的选项名称或选项值
  • EPERM:当前用户权限不足,无法设置该选项。需要根据返回值来判断函数是否执行成功,并根据具体的错误代码来处理错误情况。

bind()

bind()函数用于绑定端口

  1. 头文件:
    #include <sys/types.h> #include <sys/socket.h>
  2. 函数:
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数说明:

- sockfd :
表示要绑定的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。

- addr :
是一个指向 struct sockaddr 类型的指针,用于指定要绑定的 IP 地址和端口信息。具体的地址信息取决于所使用的协议族(如 IPv4 或 IPv6)以及地址结构体的类型(如 struct sockaddr_in 或 struct sockaddr_in6 )。

- addrlen:
是一个 socklen_t 类型的参数,表示传递给 addr 参数的地址结构体的长度。

通过这三个参数, bind 函数可以将指定的套接字与特定的 IP 地址和端口进行绑定。
  1. 返回值:
    bind 函数返回一个整数值。它的返回值表示函数执行的结果,具体含义如下:
  • 绑定成功返回0
  • 绑定失败返回1,并设置相应的错误码,可以使用 perror 函数打印错误信息,或者使用 errno 变量获取错误码。

listen()

用于监听连接

  1. 头文件:#include <sys/types.h> #include <sys/socket.h>
  2. 函数:int listen(int sockfd, int backlog);

参数说明:

- sockfd :
表示要监听的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。

- backlog:
表示等待连接队列的最大长度。它指定了在调用 accept 函数之前,可以排队等待的连接请求数量。
  1. 返回值:
    返回一个整数,0表示监听成功。-1表示出现错误,并且有相应的错误码,可以使用perror函数打印错误信息,使用errno变量获取错误码。

调用listen函数之前,必须先调用bind函数将套接字与特定的IP地址和端口进行绑定。否则, listen 函数将会失败。

accept()

  1. 头文件:#include <sys/types.h> #include <sys/socket.h>
  2. 函数:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

- sockfd :
表示要接受连接请求的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。

- addr :
是一个指向 struct sockaddr 类型的指针,用于存储连接的客户端的地址信息。

- addrlen :
是一个指向 socklen_t 类型的指针,用于指定 addr 参数所指向的地址结构体的长度,并在函数调用后更新为实际接受的地址结构体的长度。
  1. 返回值:
  • 如果接受连接成功, accept 函数返回一个新的套接字文件描述符,用于与客户端进行通信。
  • 出现错误则返回-1,并设置相应的错误码,可以使用perror函数打印错误信息,或者使用 errno 变量获取错误码。

另外,accept 函数会阻塞程序的执行,直到有客户端连接请求到达,或者出现错误。在多线程或多进程的网络编程中,可以使用 accept 函数来接受客户端连接请求,并将处理客户端请求的任务交给其他线程或进程来处理。

标签:setsockopt,编程,函数,int,知识,Linux,sockfd,接字,socket
From: https://blog.csdn.net/weixin_45962681/article/details/141901031

相关文章

  • 【分立元件】电阻的基础知识
            电阻与电容、电感一样都是最基本的元器件,大量使用于各种电气或电子设备中。对从事电气工作的人而言或许过于普通,平时忽视了它,但如果没有电阻,电气或电子电路就无法建立。电阻就是如此重要的元器件。 电阻的原理        电阻的数值取决于电阻材料的电......
  • 【Linux入门】正则表达以及sort、uniq、tr、cut命令
    文章目录正则表达1.正则表达式(RegularExpressions)常用的正则表达式元字符:1.基本元字符2.字符类元字符3.特殊字符类4.边界匹配符5.控制字符和转义字符6.贪婪与非贪婪模式示例补充sort命令基本用法常用选项示例uniq命令基本用法常用选项示例tr命令基本用法常用......
  • Unity网格编程学习(一)
    目录1.创建平面2.使用UV贴图3.使用法线贴图1.创建平面Unity有MeshFilter和MeshRenderer组件,通过编辑MeshFilter的Mesh属性进行绘制,并使用MeshRenderer将图形渲染到屏幕上。//在C#脚本顶部使用这段语句检测绑定该脚本的对象是否存在MeshFilter和MeshRenderer组件,如果没有......
  • Windows 一顿操作倒逼用户!Linux 桌面坐收渔利,市场份额攀至新高峰
    根据StatCounter的最新数据,截至2024年7月,Linux在全球桌面操作系统的市场份额已达到4.45%。虽然这一百分比对于那些不熟悉操作系统领域的人来说可能看起来很小,但它对Linux及其专注的社区来说是一个重要的里程碑。更令人振奋的是Linux采用率的上升趋势。图片1.稳定进步......
  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
    BlockingQueueBlockingQueue是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自Queue接口。BlockingQueue中的元素采用FIFO的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作,当前线程在队列满或空的情况下会被阻塞,直到被唤醒或超时。常用的......
  • C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示
    1、本节实现的内容上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析,这节课......
  • Linux宝塔Mysql两台服务器主从配置,服务器存在多个库
    实现目标:两台服务器(一台为从服务器,一台为主服务器),当主服务器的数据修改,从服务器复制主服务器的操作,实现自动修改数据;1、主数据库操作-先登录主数据库#登录数据库,用root登录方便,用其他账号会提示权限不足,需要登录root给予权限mysql-uroot-p密码2、创建一个账号,供从库用......
  • Linux-01-虚拟网络、网络命名空间
    虚拟网络    首先Linux具有丰富的虚拟网络功能,我们先简要介绍几个常用的虚拟网络接口类型:1.Bridge网桥        LinuxBridge网桥的行为类似于网络交换机。它在与其连接的接口之间转发数据包。它通常用于在路由器、网关上或在主机上的虚拟机和网络命名空间......
  • 探秘JavaScript深度领域:精通面向对象编程、虚拟DOM等核心技术
    JaScript作为前端开发的核心技术之一,凭借其强大的灵活性和广泛的应用场景,吸引了大量开发者深入学习。在探秘JaScript的深度领域时,面向对象编程和虚拟DOM等核心技术无疑是两个重要的学习方向。面向对象编程(OOP)在JaScript中扮演着重要角色。虽然JaScript是一种基于原型的语言,而非传......
  • Linux 进程管理与负载
    1.进程管理1.1进程进程:process运行起来的命令或代码或程序.进程本质运行在内存中.cpu:处理内存:软件磁盘:永久存放数据.守护进程(服务):持续运行的进程.1.2僵尸进程⭐️⭐️⭐️⭐️⭐️1.2.1概述异常进程僵尸进程:进程因为一些原因脱离系统控制,但是进程又没有正常的退......