Linux套接字编程

Linux 套接字编程基础 套接口即网络进程的ID;网络通信归根到底即为进程间的通信;套接字中包含了端口号,用来确定进程,一个端口号一次只能分配给一个进程,即端口号与进程是一一对应的;一、套接字的结构1、IPv4套接字地址结构  IPv4地址结构命名为sockaddr_in,定义在<netinet/in.h>头文件中,结构定义如下:struct sockaddr_in { sa_family_t sin_family; 阅读详情

linux

套接字编程

socket

#include <sys/socket.h>
int socket(int family, int type, int protocol);
若成功返回非负描述符,出错返回-1
    
family: 协议族 AF_INET
type: 套接字类型 SOCK_STREAM
protocol:协议类型常值 0

connect 客户用connect来建立与TCP服务器的连接

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
成功返回0,出错返回-1

sockfd: socket返回的套接字描述符
*servaddr: 指向一个套接字地址结构的指针 (SA *)&cliaddr
addrlen: 套接字大小 sizeof(cliaddr)

bind 把一个本地协议地址绑定一个套接字 //服务端

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
成功返回0,出错返回-1
sockfd:套接字描述符
myaddr:本地套接字 servaddr
addrlen:siezof(servaddr)

listen 仅由服务器调用,1将未连接套接字转换成被动套接字,2规定了该套接字的最大连接个数

#include <sys/socket.h>
int listen(int sockfd, int backlog);

通常在调用socket和bind函数之后,并在调用accept之前调用
backlog = 未完成连接队列 + 已完成连接队列之和

accept 从已完成连接队列队头返回下一个已完成连接

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

cliaddr: 客户的套接字 (SA *) &cliaddr
addrlen:客户套接字地址引用 &cli_len
如果我们对客户的协议地址不感兴趣,可以置为空指针

close 关闭套接字,终止TCP连接

#include <unistd.h>
int close(int sockfd);

Sample:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <iostream>
#include "../request.h"

int main(int argc, char *argv[])
{
	int listenfd, connfd; 
	struct sockaddr_in servaddr, cliaddr; //两个套接字结构,一个服务器,一个客户
	socklen_t serv_len, cli_len;
	listenfd = socket(AF_INET, SOCK_STREAM, 0); //套接字listenfd

	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //自动源主机ip
	servaddr.sin_port = htons(9999);

	//serv_len = sizeof(servaddr);

	bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); //绑定
	listen(listenfd, 100); //转换成被动套接字,最大连接数量100

	while(1)
	{
        char ch[5000];
        std::string rec;
		cli_len = sizeof(cliaddr);
		connfd = accept(listenfd, (SA *) &cliaddr, &cli_len); //accept
		int n;
		while((n = read(connfd, &ch, 5000)) > 0)
		{
			ch[n] = 0;
			rec += ch;
		}

		write(connfd, &send_str, sizeof(send_str)/sizeof(send_str[0]));

		close(connfd);
	}

}

getsockname & getpeername

这两个函数或者返回与某个套接字关联的本地协议地址,或者返回与某个套接字关联的外地协议地址

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
  • 在一个没有调用bind的TCP客户上,connect返回成功后,getsockname用于返回由内核赋予的本地ip地址和本地端口号
  • 在以端口号0调用bind(告诉内核去选择本地端口号)后,getsockname用于返回由内核赋予的本地端口号
并发
  • fork
#include <unistd.h>
pid_t fork(void);
返回:在子进程种为0, 在父进程种为子进程id,出错为-1

子进程可以通过调用getppid得到父进程的ID,父进程记录每次调用fork的返回值来记录子进程ID
pid_t pid;
int listenfd, connfd;
listenfd = socket(.....);

bind(listenfd,...);
listen(listenfd, 100);

while(1) {
    connfd = accept(listenfd, ....);
    if( (pid = fork()) == 0) { //fork创建子进程
        close(listenfd); //子进程关闭监听套接字
        doit(connfd); //process the request
        close(connfd); //处理完关闭已连接套接字
        exit(0);
    }
    /*
    line 10-15 是子进程
    */
    close(connfd); //父进程
}

每个文件或描述符都有一个引用计数,引用计数在文件表项中维护,它是当前打开着的引用该文件或套接字的描述符的个数

上面代码中 socket返回后,与listenfd关联的文件表项的引用计数为1,accept返回后,与connfd关联的文件表项的引用计数也是1. 然而fork返回后 这两个描述符在父进程和子进程之间共享(也就是被复制),所以这两个套接字相关联的文件表项的引用计数为2,这样父进程关闭connfd,在listenfd继续等待下一个连接,而子进程关闭listenfd,去connfd处理请求去,处理完成之后关闭connfd,该套接字才真正的清理和资源释放。

也就是说只有计数为0时,才会发送FIN报文,然后正常的TCP连接终止序列。如果我们确实想在某个TCP连接上发送一个FIN,可以改用shutdown函数代替close。

后续持续更新~

Ubuntu22.04安装ROS1 代表使用 2 线程进行编译,可以根据 CPU 适当调整。如果出现小乌龟窗口,说明安装成功 🎉!启动成功,则打开另一个终端,测试。需要解决一些兼容性问题,因为。由于 Ubuntu 22.04。过程,确保成功安装。 阅读详情

相关推荐

带你了解如何分析Jmeter监听器常用图表并定位瓶颈

1.1 Jmeter监听器常用图表 目录 1.1 Jmeter监听器常用图表 1.1-1 查看结果树 1.1-2 汇总报告 1.1-3 集合报告 1.1-4 综合图 1.1-5 断言结果 1.1-6 图形结果 1.1-7 响应时间图 1.2 Jmeter性能瓶颈定位 1.2-1 性能瓶颈产生的原因 1.2-2 性能瓶颈的解决方法 1.2-3 性能瓶颈如何定位 1.1-1 查看结果树 查看结果树:调试利器。可以查看每个请求具体的详情,方便进行测试的比对。有点类似我...

weixin_49029722的博客 4450

Linux Logs: How to View, Read & Configure

log。

allway2的博客 657

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 357

linux网络流量监测工具,linux下网络流量监控工具

今天QA同学让我协助检测下一台服务器的网络流量。没干过这活,在网上随便找了个命令。后来,发现是不对的,为了以后不出丑,决定收集下网络流量监测相关的工具。查看某个网卡收发数据的总量方法一 方法二 2.查看网卡的实时的流量工具一网上找到的一个脚本,基本上来说是处理ifconfig的结果,得到单位时间内的流量。也可以通过处理/proc/net/dev文件得到同样的结果。使用方法:bash scriptf...

weixin_39908588的博客 216

ComfyUI新手必看:JoyCaption 2插件安装全流程(附百度网盘资源)

本文为ComfyUI新手提供了JoyCaption 2插件的完整安装与部署指南。详细介绍了从环境准备、插件获取、模型文件配置到核心节点使用的全流程,并重点解析了其集成的LLM反推模式,帮助用户高效实现从图片到精准提示词的转换。

mango的博客 303

避坑指南:从聚宽迁移到QMT必须知道的5个细节(含Redis连接异常处理)

本文详细解析了从聚宽迁移到QMT平台时需注意的5个关键细节,特别是Redis连接池优化和xtquant重连机制。通过实战代码示例,帮助量化团队解决信号传递稳定性、时间同步、滑点控制等核心问题,确保交易策略平稳过渡。

weixin_27303545的博客 426

linux查看日志步骤

1、cd tomcat/logs 2、日志按照时间顺序排列,最下方为最新的日志,ll -rt 3、进入所查日志文件:less 日志名 4、通过关键字查询:/关键字

缺钙的蜗牛 1160

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 330

linux 身份切换

su sudo 的一些用法 rt@RTdust:~$ rt代表当前用户,RTdust代表主机名 ~代表当前用户,$代表普通用户 输入: su - 会提示你输入密码,即当前用户名的密码, 切换到root用户,root@RTdust:~# 输入命令 sudo passwd root 修改root用户密码, 普通用户切换到root用户也可以用su su + name 直接su后面默认root sudo ...

netlogs的博客 356

高通camera调试经验总结

修改AF对焦模式 adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦 adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦

weixin_43381364的博客 1万+

【Burp入门第三十七篇】AutoRepeater插件安装使用教程+越权实战案例

AutoRepeater 通过接收满足特定条件的请求,按照预设的基础替换规则对请求进行处理。在接收到匹配请求后,它首先应用基础替换,然后针对每个定义的替换创建请求副本并应用该替换操作,从而实现对不同参数的修改和请求的重复发送,以此来全面检测 Web 应用的授权情况。1、自动化请求重复:能自动复制、修改并重发 HTTP 请求,避免了手动重复操作的繁琐,大大提高了 Web 应用授权测试的效率。2、灵活参数替换:可灵活改变邮箱地址、账号身份、角色、URL 和 CSRF 令牌等关键参数。

等风来 2033

【操作系统】Linux程序内存结构&内存分配

@TOC【操作系统】Linux程序内存结构&内存分配 【操作系统】Linux程序内存结构&内存分配 对于一个32位的linux操作系统,他的进程内存分布如下图: 低地址从0x00000000开始 高地址到0xFFFFFFFF 代码区: 存放程序执行代码的一段内存,内存区域只读,并且在代码段中可能也包含一些只读常量。 数据区 分为已初始化数据区 (.data)和未初始化数据区(BSS),分别用来存放已经初始化的全局变量和静态变量和未初始化的全局变量和静态变量。 其中BSS不占据目标文

netlogs的博客 1592

【深度学习新浪潮】AI 智能眼镜关键视觉技术、技术栈及开源项目全解析

Meta新款智能眼镜在演示中暴露出的AI误判和延迟问题,揭示了端侧视觉与多模态算法落地的核心瓶颈。本文从算法工程视角解析了AI智能眼镜的三大关键技术:感知增强(多帧降噪、HDR成像)、场景解析(轻量化目标检测、语义分割)和空间定位(视觉SLAM、ToF辅助),并梳理了完整的技术栈架构,包括硬件适配、驱动优化和框架选型。文章还提供了高价值开源项目参考,如OpenXR和ORB-SLAM3,为端侧视觉算法落地提供实操指南,助力开发者攻克算力约束下的实时性、精度和功耗平衡难题。

专注:太空算力、AI infra、异构调度、大模型成本工程 530

[Linux网络编程]Socket套接字

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。本文归纳整理Socket的使用

weixin_44972997的博客 3671

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux套接字编程详解

前16位是标志,是数据结构的名字。通用数据类型sockaddr,sockaddr_in和sockaddr_un是sockaddr是他们的统一形式,为了方便传参。

qq_45849625的博客 989

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux TCP套接字编程

Linux TCP套接字编程 文章目录Linux TCP套接字编程TCP套接字编程的基本步骤什么是阻塞与非阻塞套接字?先创建服务端程序:客户端程序:   TCP套接字编程的基本步骤 服务端编程的步骤如下: 创建服务端套接字。 绑定套接字到一个IP地址和一个端口上(使用bind函数)。 将套接字设置为监听模式等待连接请求(使用函数listen),这个套接字就是监听套接字了。 请求到来后,接受连接...

baboon_chen 590

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Linux网络】网络套接字编程

tcp_echo服务器tcp网络计算机。

weixin_64906519的博客 810

Linux UDP套接字编程

Linux UDP套接字编程 文章目录Linux UDP套接字编程一 UDP套接字编程的基本步骤服务端编程的步骤如下:客户端编程的步骤如下:二 服务端程序:三 客户端程序:   一 UDP套接字编程的基本步骤   服务端编程的步骤如下: 创建套接字描述符(socket)。 设置服务器的IP地址和端口号(需要转换为网络字节序的格式)。 将套接字描述符绑定服务器地址(bind)。 从套接字描述符读...

baboon_chen 714

Linux 网络套接字编程基础

Linux 网络套接字编程基础

m0_73096566的博客 1170

【Linux】Linux下使用套接字进行网络编程

🔥❤️在自定义的头文件中重新声明一个函数,函数名与接口函数不同,返回值、参数均与接口函数相同。在相应的源文件中定义我们的函数,将逻辑判断的过程放在函数中。这样在调用函数时就省去大量的if else判断int# endifint# endifintprotocol);

代码兴国 1666

Linux网络编程——套接字socket

网络编程???套接字??拿来吧你!!!

wzh18907434168的博客 1883

Linux网络——套接字编程

在公网上, ip 地址能标识唯一一台主机,端口号 port 能标识该主机上的唯一一个进程,因此我们可以使用 ip:port 来表示全网唯一的一个进程而我们将 client_ip:client_port 与 server_ip:server_port 间的通信称为套接字编程!

qq_73201597的博客 1184

Linux UDP网络编程套接字sockets

在学校我们用学号,相比于身份证更简便,假如我的学号是2211211023,这样就能看到我是22级的,方便阅读信息。但是,这两个结构体都不用,我们用 sockaddr。网络通信的本质是进程间通信,有了 IP 就可以标识公网内唯一的一台主机,想要完成网络通信我们还需要一个东西来标识一台主机上的某个进程,这个标识就是端口号(port)。三种应用场景:网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信,而原始套接字可以跨过传输层(TCP/IP 协议)访问底层的数据。

puppy_1mo的博客 1125

Linux网络编程 套接字

Linux网络编程 套接字    一:概述    Socket 的英文原意就是“孔”或“插座”,现在,作为BSD UNIX 的进程通讯机制,取其后一种意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接受信号(或能量),有的可以发送信号(或能量)。假如电话线与电话机之间安放一个插座(相当于二者之间的接口,这一部分装置物理上是存在的)则Socket 非常相似于电话插座。

mazidao2008的专栏 3647

Linux 网络编程(二)——套接字编程简介

2 Socket 套接字 2.1 什么是 Socket 2.2 Socket编程的基本操作 2.3 地址信息的表示 2.4 网络字节序和主机字节序的转换 2.4.1 字节序转换 2.4.2 网络地址初始化与分配 2.5 INADDR_ANY 2.6 Socket 编程相关函数 2.7 C标准中的 main 函数声明 2.8 套接字应用示例

m0_60875396的博客 1294

《Linux C编程实战》笔记:套接字编程

socket()创建 socketbind()绑定 IP+端口listen()设置监听状态accept()接受客户端连接并获得新 socket。

ouliten的博客 1346
上一篇: github搭建个人博客
下一篇: C++ 智能指针
netlogs
博客等级 码龄9年 11粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值