套接字编程简介

GitLab教程(四):分支(branch)和合并(merge) 命令进行合并时,Git具备一定的智能自动化处理能力:如果一个分支仅修改了文件A,而另一个分支独立地修改了文件B,Git能够无缝整合这些更改,自动完成合并过程——即最终的代码既包含了对A文件的修改也包含了对B文件的修改。同样地,若两个分支虽然都修改了同一个文件,但涉及的是文件中互不重叠的部分,比如一个改动发生在第一行,另一个则在第二行,Git同样能巧妙地自动合并这些非冲突性修改。获取了远程分支的最新变化,或者当你想要合并本地的一个分支到当前分支时,就会用到这个命令。,默认会尝试合并远程分支到当前分支。 阅读详情

套接字编程简介

项目:UNIX网络编程学习

作者:曾金龙

供职:(深圳迅雷网络技术股份有限公司)

领域:迅雷下载库研发

日期:2014-07-25


1, TCP连接图

socket编程,过眼烟云的去看,无外乎就那么几个API,但是,如果想登堂入室,必须注重里面的每一个细节。


对于TCP编程而言,最重要的是记住这么一幅图。死记的基础上理解。

windows下有visio,ubuntu下只好用Dia,不是很习惯,而且不支持中文输入。


图1 TCP连接的数据包交换图

你特别需要注意的是:

1)哪个地方会被阻塞住,例如读取数据的时候,如果对方没有写数据,则会被阻塞,对方要是关闭了连接则会读取到0(EOF);

2)在每一个阶段如果顺序发生了变化,将会是怎么样。例如,我们总是习惯对方写,我们读,然后我们写,对方读,如果不读怎么样?或者一直写。write是很少会被阻塞的,除非写满了了内核的缓冲区,free空间比它的下限还要小。当然一旦free空间大于其下限,Epoll等待的时候是会被唤醒的,EPOLLOUT,表示可以写。

3)如果彼此在不同的时机宕机了,脱离网络了,拒绝访问了,关闭了等,又将会发


生什么?会有一些是TIME_OUT,一些是会受到RST,一些是受到FIN。这个就是TCP的细节。而细节决定成败。

在迅雷的网络模组中,已经把socket打包在公共库里面,配合异步框架使用。前辈们的代码还是很优秀的。特别是用select ,poll,epoll,配合signal,pipe,mutex等这些实现的异步框架,是迅雷架构里面最优美的代码之一。(迅雷用C实现C++的代码也值得细品)


2 地址结构

编程要用到的地址结构就是这个,再在用socket函数的时候强制类型转换成struct sockaddr

struct in_addr{in_addr_t    s_addr;};

struct sockaddr_in{
uint8_t    sin_len;
sa_family_t    sin_family;
in_port_t    sin_addr;
char    sin_zero[8];
};

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

其他的一般还用不到,用到再查阅。

对了,有些博客你会发现它们写的结构不太一样,就是没有开头的sin_len和sa_len,这个问题在书中有说过,为了兼容了ISO,后来在BSD4.3的时候加入的,其实,作为一个数据结构,在头部加一个本结构的长度,就实现了该结构可变长。

3 主机--网络字节顺序问题

不同的主机它存在大小端问题,所以在网络中交换的数据,必须处理大小端不一致的问题。

3.1)如何检测自己的机子是大端还是小端


书中定义了一个union联合体,其实,不用。

BOOL isBigEndian()
{
     short  v=0x0102;
     char* c=(char*)&v;
     if(c[0]==0x01&&c[1]==0x02)return TRUE;
     else return FALSE;
}

3.2)主机字节顺序和网络顺序之间的转换函数

host to network short(long)
network to host short(long)
就这四个函数。
#include <netinet/in.h>
uinit16_t htons(uint16_t host16bitvalue);
uinit32_t htonl(uint32_t host32bitvalue);
uinit16_t ntohs(uint16_t nett16bitvalue);
uinit32_t ntohl(uint32_t net32bitvalue);

3.2)内存操作函数

bxx和memxx的对比,特别是拷贝函数。我们用实验要验证bcopy和memcpy对重叠内存的处理。

#include <strings.h>
void bzero(void* dest,size_t nbytes);
void bcopy(const void* src ,void* dest,size_t nbytes);
int bcmp(const void *ptr1,const void *ptr2,size_t nbytes);

#include <string.h>
void* memset(void* dst, int c, size_t len);
void* memcpy(void* dst,const void* src,size_t nbytes);
int memcpy(const void* ptr1,const void* ptr2,size_t nbytes);

下面我们通过测试代码一看究竟,bcopy和memcpy的区别。
/*author:ZengJinlong ,xunlei*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>

int main()
{
    int a=0x01020304;
    printf("int size:%d\n",sizeof(int));

    char* p_a=&a;
    printf("a adress:%p,p_a:%x\n",&a,p_a);
    if(p_a==&a)
    {
        printf("equal\n");
    }

   printf("%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3]);

    if(p_a[0]==0x01&&p_a[1]==0x02)printf("Big-Endian\n");
    else printf("Little-Endian\n");

    printf("case 1\n");
    char* p1=p_a+2;
    printf("before bcopy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("bcopy 0 to 2 ,2 size\n");
    bcopy(p_a,p1,2);
    printf("0x%x\n",(int)*p1);
    printf("after bcopy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);

    printf("case 2\n");
    a=0x01020304;
    p1=p_a+1;
    printf("before bcopy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("bcopy 0 to 1, 2 size\n");
    bcopy(p_a,p1,2);
    printf("0x%x\n",(int)*p1);
    printf("after bcopy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);

    printf("case 3\n");
    a=0x01020304;
    printf("before memcpy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("memcpy 0 to 2, 2 size\n");
    char* p2=p_a+2;
    memcpy(p2,p_a,2);
    printf("after memcpy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("0x%x\n",(int)*p2);

    printf("case 4\n");
    a=0x01020304;
    printf("before memcpy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("0x%x\n",a);
    p2=p_a+1;
    printf("memcpy 0 to 1 ,2 size\n");
    memcpy(p2,p_a,2);
    printf("after memcpy:%2x,%2x,%2x,%2x,%2x,%2x\n",p_a[0],p_a[1],p_a[2],p_a[3],p_a[4],p_a[5]);
    printf("0x%x\n",(int)*p2);

    return 0;
}

输出结果为如图所示,可以看出bcopy是可以正确处理内存重叠时候的拷贝,而memcpy则不能。想想,bcopy是如何实现的呢?memcpy很简单,我们就不再多说。bcopy的代码,我个人有个实现方案,很简单。


图 bcopy 和 memcpy的拷贝效果对比

bcopy实现原理,计算重叠了多少,然后先拷贝重叠部分,回过头再拷贝前面的部分。
实现代码:
void bcopy_new(const void* src,void* dest,size_t nbytes)
{
    if(dest>src && ((unsigned)src+ nbytes > (unsigned)dest))
    {
        size_t gap=(unsigned int)dest - (unsigned int)src;
        size_t overlap = nbytes-gap;
        int i=0;
        while(i<overlap)
        {
            *((char*)dest+gap+i)=*((char*)dest+i);
            ++i;
        }
        i=0;
        while(gap--)*((char*)dest++)= *((char*)src++);
        return;
    }
    while(nbytes--)*((char*)dest++)= *((char*)src++);
    return;
}

将bcopy_new替换掉上面bocpy的例子,可以得出和bcopy一样的结果。
3.3)IP地址转换函数
由点分格式转换成网络字节码以及反过来。记住两个即可。

#include <arpa/inet.h>
int inet_pton(int familyconst char* strptr,void* addrptr);
const char* inet_ntop(int family,const void* addrptr,char* strptr,size_t len);




Genesis物理引擎实战指南:轻量级确定性刚体仿真核心 刚体物理仿真作为机器人控制、嵌入式运动学验证和确定性游戏开发的基础技术,其核心在于数值稳定性、跨平台可复现性与约束求解精度。本文围绕线性互补问题(LCP)求解、半隐式欧拉积分和零依赖C++实现三大关键技术展开,解析如何在无GUI、低算力环境下构建可单步调试、帧级可控的确定性仿真系统。重点覆盖碰撞检测数学建模、关节局部坐标系绑定、质量-惯性张量一致性校验等工程落地关键点,适用于STM32、树莓派及教育实验场景。内容深度结合Genesis Physics Engine的源码实践,直击‘穿模’‘NaN’‘关节发软 阅读详情

相关推荐

ANSYS/ANSYS Workbench生成mnf文件导入到Adams相关问题浅显解释

ANSYS/ANSYS Workbench生成mnf文件导入到Adams相关问题浅显解释。

weixin_45551870的博客 6984

AVL树删除算法的实现--长安大学毕业设计

AVL₩ᅠム￧レト¥ネᅠ←ルᄂ￧ᆴラ₩ᄈユ￧レト¦ᄌᄂ￧ᄃヘ¥ᆴ゙￧ホᄚ₩ヨᄍ₩ᄈユ ←ᆱリ¦ᄌタ¥ヌᄀ  ₩ロᄒ←ヌム←ᄒル ￯ᄐネ←ユ﾿¥ᆴノ¥ᄂᄃ¥ᆳᆭ¦﾿ᄀ₩チᆵ¥ᄋᆬ￧ᄄヒ¥ᆳᆭ←ルᄁ│ᄑᆵ¦ᄏᄊ¥ᄋᆬ￧ᄄヒ￧ᄈᄏ￯ᄐノ ₩ムリ│ᆭチ￯ᄐレAVL₩ᅠム₩リᆵ¦ᄌタ￧ᄃヘ←ヌヘ│ᆭチ￧レト₩ユᄚ₩ヘᆴ￧ᄏモ₩゙ト￯ᄐフ¥ヌᄀ₩リᆵ│テᄑ¥ᄂ゚￧ヤᄄ¦ᄎフ¥マノ₩゚ᆬ₩ノᄒ₩ᅠ

MiniMicall的专栏 2133

【软件介绍】RVC本地部署使用方法

【摘要】RVC是一款功能强大的开源语音转换工具,具有实时处理、多音效选择、高质量音频处理等特点。文章详细介绍了RVC的安装与使用方法:1)配置Python环境;2)根据电脑系统选择对应安装包解压;3)启动程序进入浏览器操作界面。重点讲解了声音克隆的关键步骤:建议使用短音频素材,选择合适训练方法(推荐pm或rmvpe),设置100次训练轮数,生成的模型文件存入weights文件夹。最后通过上传音频即可实现声音克隆。操作过程需注意保持程序运行状态,并提供了相关资源下载地址。

心动的那一刻,记忆便盛开了花 2979

套接字编程

套接字编程就是网络通信程序的编写,现在网络中的各种通信都是客户与服务器之间的通信,用户与用户之间的通信,本质上就是用户与服务器之间通信,然后服务器再与另一个用户进行通信,从而实现用户和用户之间的通信,要实现这些,都需要依靠socket,以下将介绍如何进行套接字编程。

weixin_63178060的博客 2110

Ubuntu 24.04 新增用户并禁用 root 账户操作指南

Ubuntu 24.04 新增用户并禁用 root 账户操作指南

深山技术宅的博客 1859

告别玄学调参:手把手教你用20元件模型搞定GaN HEMT高频仿真(附S参数提取避坑指南)

本文详细介绍了如何使用20元件模型优化GaN HEMT高频仿真,解决传统16元件模型在10GHz以上频段的误差问题。通过S参数提取避坑指南和实战案例,帮助工程师精准建模分布式电极效应和寄生反馈路径,提升射频电路设计效率。

weixin_42523693的博客 442

基本的TCP套接字编程(详解)

目录一、预备知识1. 理解源IP地址和目的IP地址2. 理解源端口号和目的端口号 3. 通过IP地址、端口号、协议号进行通信识别 4. 认识TCP协议和UDP协议1.UDP的特点及目的2.TCP的特点及目的 5. 网络字节序1. 大端字节序和小端字节序的回顾 2. 字节序6. 地址转换函数 1. inet_aton函数2. inet_ntoa函数3. inet_addr函数二、socket编程接口1. socket常见的API1. 创建套接字2. 绑定端口号3. 监听套接字4. 接受请求5. 建立连接2.

M的博客 1万+

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1447

套接字编程-TCP网络编程

tcp 网络编程,套接字地址结构,用户态socket编程

Hbw_aini的博客 5467

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 562

YOLOv8【第十一章:视频追踪与流处理篇·第3节】匈牙利算法(Hungarian Algorithm)与 KM 算法匹配机制详解!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 445

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的博客 1296

【SigmaStudio】自定义算法组件之源码规范(二)

工作中自定义算法组件一般是dll文件,生成dll文件需要XML文件和DLB文件,记录一下DLB文件代码的编码规范,定义SigmaStudio SHARC算法开发的编码规则,涵盖函数原型、内存管理、接口结构体等关键要求,确保算法模块与SigmaStudio环境兼容

liang_song的博客 1377

套接字编程简介<一>

具体请参见点击打开链接(https://github.com/uttp/UNIX-Network-Programming/blob/master/chapter3) 从第二部分基本套接字编程开始 第三章主要是套接字编程的简介,主要介绍了套接字编程后面要用到的主要函数 3.2节套接字地址结构 3.2.1 IPv4 套接字地址结构包含在头文件中 struct in_addr

从这里开始...... 854

IEM模型,地表粗糙度模拟

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

套接字(socket)编程简介

套接字(socket)编程简介 现在的网络编程几乎都是用的socket。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信? 这些都得靠socket!那什么是socket?下面介绍一下socket的相关概念和一些基本函数。 套接字概念 Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。 既然是文件

qq_43169752的博客 2508

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

00. 目录 文章目录00. 目录01. 概述02. 套接字属性03. socket函数04. 套接字地址结构05. 附录 01. 概述 Socket套接字由远景研究规划局(Advanced Research Projects Agency, ARPA)资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将TCP/IP协议相关软件移植到UNIX类系统中。设计者开发了一个接口,以便应用程序能简单地...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 2845

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

unix网络编程之套接字编程简介

一   套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。 1.IPV4套接字地址结构(网际套接字地址结构),以sockaddr_in命名。头文件:,长度最少16字节。 POSIX定义: struct in_addr{    in_addr_t      s_addr; }; struct sockaddr_in {    uint8_t

qq_24395625的博客 292

双机通信套接字编程_Chapter3 套接字编程简介

Chapter3 套接字编程简介套接字地址结构IPV4套接字地址结构,也称为”网际套接字地址结构“.struct sockaddr_in定义在头文件<netinet/in.h>中,具体如下:typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; // 32-bit I...

weixin_35663718的博客 253
上一篇: AVL树删除算法的实现
下一篇: C语言内存泄露检测--Memwatch
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值