Linux下Socket编程学习(三)

Linux Socket编程 Socket是网络编程中的一个概念,用于标识网络通讯中的一个进程。在网络通讯中,“IP地址 + TCP或UDP端口号” 可以唯一标识一个进程,这个标识被称为Socket。Linux下的Socket编程涉及多个系统调用,通过这些调用可以实现网络通信。无论是TCP还是UDP协议,Socket编程的基本流程相似,主要包括创建Socket、绑定地址、监听连接、接受连接、发送和接收数据等步骤。通过实例代码,可以更好地理解和掌握这些操作。 阅读详情

1、流协议与粘包

2、粘包产生的原因

3、粘包处理方案

4、readn writen


TCP 是流协议没有边界容易产生粘包。

解决方案:

   1、定长包

   2、包尾加\r\n(ftp) 有一定问题 消息本身具有\r\n就无法区分边界

   3、包头加上包体长度

   4、更复杂的应用协议

解决TCP粘包问题,读取指定大小的数据

  size_t readn(int fd,void *buf,size_t count)
  {
     size_t nleft = count;  //剩余的字节数
    size_t nread;          //已经接收的字节数
     char *bufp = (char*) buf;
 
     while(nleft > 0)
     {
         if(nread = read(fd,bufp,nleft) <0)
        {
             if(error == ETINTR)   //被信号中断了
             {
                 continue;
             }
             return -1; //出错
         }
         else if(nread == 0)
             return count-nleft;    //对等方关闭
         bufp += nread;
         nleft -= nread;
     }
     return count;   //读到的字节数
 }
发送指定大小的数据

 size_t writen(int fd,const void *buf,size_t count)
 {
     size_t nleft = count;  //剩余发送的字节数
     size_t nwritten;          //已经发送的字节数
     char *bufp = (char*) buf;
 
     while(nleft > 0)
     {
         if(nwritten = write(fd,bufp,nleft) <0)
         {
             if(error == ETINTR)   //被信号中断了
             {
                continue;
            }
             return -1; //出错
         }
        else if(nwritten == 0)
             continue;
         bufp += nwritten;
        nleft -= nwritten;
     }
     return count;   //读到的字节数
  }



Linux socket编程 domain用于指定协议族(PF)或地址族(AF),不过通常两者区别不大,选择其中一种使用即可。经常使用的参数类型有如下几种:type用于指定socket的类型,常见的类型如下:protocol用于指定协议,通常与第二个参数搭配使用,常见的如下:typetypeSOCK_DGRAMtypeSOCK_RAM※注:当protocol参数设置为 0 时,系统会根据domain(地址族)和type(套接字类型)参数自动选择一个合适的默认协议。 阅读详情

相关推荐

Linux TCP/IP Socket编程

一.Socket TCP/IP流程图 socket流程图 二.关键数据结构/结构体 sockaddr_in 在列出sockaddr_in结构体之前先将sockaddr结构体说明,此数据结构用作bind、connect、recvfrom、sendto等函数的参数,指明地址信息。sockaddr定义如下: struct sockaddr { unsigned short sa

specialshoot的博客 3340

Linux下Socket编程学习(一)

sockaddr_in详细讲解 IPV4套接口地址结构通常也称为”网际套接字地址结构“,它以"sockaddr_in"命名,定义在头文件 中 struct sockaddr_in{    uint8_t sin_len;    //整个sockaddr_in结构体的长度    sa_family_t sin_family;    //指定地址家族,AF_INET使用的是ipv4协议  

startFromWeb的专栏 856

Linux下Socket编程

学习socket编程前要先明白网络应用程序通信流程应用程序 A 要将数据”hello” 传给网络上另外一台主机上的应用程序 B, 数据“hello”从应用层发送给传输层后,传输层在数据前面加上 tcp 协议或 udp 协议的报头,将整条报文发给网络层,网络层添加自己的 IP 报头,再将整条数据发送给数据链路层。数据链路层将数据封装成能在网络中独立传输的数据单元,即数据帧。封装好的数据帧通过网络传输到另一台主机,然后再从下层依次拆包,将数据部分送往应用层。应用程序 B 就得到了数据” hello”。

oorik的博客 2112

Linux下Socket编程学习(五)

这章讲下产生SIGPIPE信号的原因 往一个已经收到FIN的套接字中写是允许的,接收到FIN仅仅代表对方不再发送数据。 如果对方进程不存在了,你还写数据那么会返回一个RST段RST段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号直接忽略就ok了 singal(SIGPIPE,SIG_IGN); 五种I/O模型 阻塞I/O 非阻塞I/O I/O复用(sele

startFromWeb的专栏 865

实战Linux+Socket编程.pdf

实战Linux+Socket编程.pdf

Linux下socket编程初学者的体会,希望对其他初学者有帮助

免费分享一下关于Linux下socket编程的基本原理和相关函数的解析,还有一下其他的体会,如有不对的地方请指正。

socket/io(1)、Linux的socket编程详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(mes......

黄规速博客:学如逆水行舟,不进则退 34万+

DDR5内存命令真值表详解:如何正确解析JESD79-5标准中的关键指令

本文深度解析JESD79-5标准中的DDR5内存命令真值表,将其视为动态通信协议进行拆解。详细阐述了1-Cycle与2-Cycle命令的区别、Bank Group寻址机制以及模式寄存器(MR)操作流程,为硬件与固件工程师提供了从信号解析到系统调试的完整实战指南,是理解和优化高性能计算平台内存子系统的核心。

numpy6sculptor的博客 548

Linux下Socket编程基础

Socket是网络通信的端点抽象,如同现实世界中的电话插座,一个人想要用电话,肯定需要把插头插到插座中,而在网络上你想跟其他节点通信,也需要将socket这个插头插进网络中。在Linux系统中,socket表现为一个int类型的文件描述符,我们完全可以把其当作一个文件,对其执行读取写入等操作。

cooler_water的博客 2544

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 594

Linux下简单socket编程

Linux下简单socket编程 socket的英文翻译是接口、插座的意思,很形象,就相当于将两个台电脑用一根线连起来,线的两头分别是插头,插在两台电脑上,借此实现通信。 两台电脑通信,实际上是这两台电脑上的某个进程在进行通信。而两个进程进行通信,实际上是往同一个文件中读取数据。 在理解socket编程之前,先大概了解一下socket缓冲区的概念。 socket编程基于传输层,是应用层和传输层之间...

weixin_41249411的博客 1万+

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

【Linux】SOCKET编程

传统的进程间通信借助内核提供IPC机制进行,但是只能限制于本机通信,若要进行跨机通信,就要使用网络通信。​ 网络通信的本质是借助内核提供SOCKET伪文件的机制进行通信,实际上是使用了文件描述符,因此需要使用内核提供的socketAPI函数库(在传输层层面进行)。

Demok123的博客 3199

使用MID360在室内快速定位

在预构建的点云地图中实现实时3D全球定位。通过融合FAST-LIO的低频全局定位(约0.5~0.2Hz)和高频里程计,整个系统的计算效率很高。消除里程计的累计误差初始定位可以通过RVIZ的粗略手动估计或来自另一个传感器/算法的姿势来提供。

CTwinkle的博客 1162

S7-1200PLC期末复习题(第七章)

A.0 B.1 C.4 D.-4 A、CV = 0 B、CV = 1 C、CV < 4 D、CV >= 4A、0,0 B、3,0 C、1,1 D、3,1 A、0 B、1 C、先是1,再变为0 D、先是0,再变为1置位输出:常开触点M0.0闭合,Q0.0变为1状态并保存该状态,即使M0.0断开,Q0.0也保持1状态。 复位输出:常开触点M0.1闭合时,Q0.0变为0状态并保持该状态,即使M0.1断开,Q0.0也保持为0状态。 A、1 B、0 C、5 D、10RESET_BF指令需要两个参数,第一个是复位的位数

qq_52251819的博客 4420

Linux网络——Socket编程

结果如下:当出现上述字段时,证明网络是连通的,这里值得注意的是,,但是我们也可以指定ping命令的检测次数,指令为:如图,执行指定次数后便会立即退出。

2303_78442132的博客 1566

具身智能:原理、算法与系统 第18章 模仿学习与人类示范

与基于试错机制的强化学习不同,模仿学习假设存在能够提供高质量轨迹示范的专家策略,学习者的目标是在不直接访问专家内部决策机制的情况下,复现或泛化专家的行为模式。此外,选项 GAIL(Option-GAIL)将分层强化学习与对抗模仿结合,学习选项(Options)级别的策略,能够捕捉专家示范中的多模态行为与高层意图。X-Sim 框架提出从真实到模拟再到真实的迁移路径:首先从人类视频中重建物理仿真环境,在仿真中训练状态级策略,随后通过策略蒸馏获得基于视觉的策略,最后通过在线领域自适应对齐真实与仿真观测。

VectorShift的博客 125

【linux】Socket网络编程

IP 在网络中, 用来标识主机的唯一性。,例如使用qq从qq服务器上获得数据。

fulufulucode的博客 1407

开源项目evo2安装教程

Evo 2 是一种先进的 DNA 语言模型,用于长上下文建模和设计。Evo 2 使用 StripedHyena 2 架构在单核苷酸分辨率下对 DNA 序列进行建模,上下文长度可达 100 万碱基对。Evo 2 使用 Savanna 进行预训练,并在 OpenGenome2 数据集上进行自回归训练,该数据集包含来自所有生命领域的 8.8 万亿个标记。

猿小白的博客 927

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Linux】socket网络编程之UDP

udp网络套接字编程,实现了一个客户端可以通过指令操控服务器,然后将服务器应该输出的结果打印到客户端

s_little_monster的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Windows Socket和Linux Socket编程的区别

SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。 Socket 编程 windows到Linux代码移植遇到的问题 1、一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2、网络 socket相关程序从windows移植到linux下需要注意的  1)头文件 windows下winsoc

白永辉的专栏 4601

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux下的Socket编程

网络通信前,通信双方需要知道本机与对方主机的IP地址,方可进行通信。在IP数据报的报头中需要包含有和这两个地址,源IP地址即为本机地址,目的IP地址即为对方地址。其中,在报头中包含的目的IP地址用于本机向对方主机发送请求报文,而源IP地址则是使对方主机能知道该报文的发送方身份。当对方主机将报文处理完毕后,会将作为,从而对不同主机的请求进行正确响应。

m0_74310998的博客 1380

基于Socket编程下 实现Linux-Linux、Linux-Windows tcp通信

Socket编程基础、TCP传输控制协议。①、调用 socket()函数打开套接字,得到套接字描述符;②、调用 bind()函数将套接字与 IP 地址、端口号进行绑定;③、调用 listen()函数让服务器进程进入监听状态;④、调用 accept()函数获取客户端的连接请求并建立连接;⑤、调用 read/recv、write/send 与客户端进行通信;⑥、调用 close()关闭套接字。

Bit_Dong的博客 2184

Linux下的socket编程

Linux下的网络编程的含义 linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符(可类比文件操作),socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。 常见 socket 分类

菜鸟502的博客 4118
上一篇: Linux下Socket编程学习(二)
下一篇: Linux下Socket编程学习(四)
startFromWeb
博客等级 码龄16年 23粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值