(一)关于socket编程的一些基础数据类型

Linux网络编程【一】:TCP socket套接字详解 1.socket socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为 socket。 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socketpair就唯一标识一个连接。 socket本身 有“插座”的意思,因此用来描述网络连接的一 对一关系 阅读详情

经常使用socket进行数据通信,经常会被里边的一些数据类型以及结构体搞蒙,下边进行分类,代码不是死记硬背,分类记住就好,要用到的时候,知道有这个用法,再慢慢去细查具体使用方法

一下是一个简单的tcp服务端,根据服务端的代码对用到的数据类型和结构体做一个简单的讲解,根据标号,寻找对应的注释

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SERV_PORT 9898
#define READ_SIZE 100
void error_handling(char *message);

//TCP 服务器的流程
// create sockct()
// bind()
// linsten()
// accept()
// read()
// write()
// close()


int main(int argc, char const *argv[])
{
    int serv_sock,clnt_sock;//套接字文件描述符
    int clnt_addr_size;
    char readbuf[READ_SIZE]={0};//接收缓存

    struct sockaddr_in serv_addr,clnt_addr;//描述ip地址信息的结构体 详细见代码段1


    serv_sock=socket(PF_INET,SOCK_STREAM,0);//创建套接字文件描述符
    if(serv_sock==-1)
        error_handling("creat socket error!");

    memset(&serv_addr,0,sizeof(serv_addr));//这一步是必须的
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr=htonl(INADDR_ANY);//设置服务器IP地址 详细见代码段2
    serv_addr.sin_port=htons(SERV_PORT);//设置服务器端口

    if(bind(serv_sock,(struct socaddr *)&serv_addr,sizeof(serv_addr))==-1)//注册套接字
    {
        error_handling("bind error");
    }
    if(listen(serv_sock,5)==-1)//监听该端口
    {
        error_handling("listen error");
    }

    clnt_addr_size=sizeof(clnt_addr);
    while(1){
        clnt_sock=accept(serv_sock,(struct socaddr *)&clnt_addr,clnt_addr_size);//这里会阻塞,等待客户端连接
        read(clnt_sock,readbuf,READ_SIZE-1);//读取客户端发送来的数据
        write(clnt_sock,readbuf,sizeof(readbuf));//将数据原样返回
        close(clnt_sock);
        break;
    }
    close(serv_sock);
    return 0;
}
void error_handling(char * message)
{
    printf("%s\n",message);
}

代码段1:

头文件:
#include <arpa/inet.h>

struct sockaddr_in
{
    sa_family_t         sin_family; //地址族  AF_INET IPv4     AF-INET6  IPv6       AF-LOCAL  本地采用的UNIX协议的地址族
    uin16_t             sin_port;  //端口号
    struct in_addr      sin_addr; //32位的IP地址  网络字节序保存的,往里边写的数据需要是网络字节序的
    char                sin_zero[8]//不使用
};

struct in_addr
{
    in_addr_t s_addr; //   32位的IPv4地址
};

代码段2:

//字节序的转换
//网络字节序都是大端序,计算机上的本地字节序有的是大端有的是小端,设置ip地址的时候,结构体里边保存的是大端序,所以要先将本地的字节序转换成大端字节序

//字节序转换函数
unsigned short htons(unsigned short);//名字缩写:host to net short     将short类型的数据从主机字节序转换成网络字节序
unsigned short ntohs(unsigned short);//跟上边正好相反,从网络字节序转换成主机字节序

unsigned long htonl(unsigned long);//名字缩写:host to net long     将long类型的数据从主机字节序转换成网络字节序
unsigned long ntohl(unsigned long);//跟上边正好相反,从网络字节序转换成主机字节序


//使用上边的函数,输入参数要么是short类型的或者而是long类型的,ip地址的书写方式一般是点分十,也就是192.168.0.1,这种写法,如果要输入,还要转换成对应的整形数据,这样计算的时候就很麻烦
/////*********************************************************************************///
//帮助转换函数1,字符串ip->大端字节序的IP地址
in_addr_t inet_addr(const char * string);
//成功的时候返回大段序整数型的值,失败返回INADDR_NONE,此函数能过滤非法地址,当输入的ip地址不合法的时候会返回失败
//用法:
struct sockaddr_in addr_inet;
//赋值ip地址的时候,写法为
addr_inet.sin_addr.s_addr=inet_addr("192.168.0.1");

//帮助转换函数2 字符串->ip
int inet_aton(const char *string,struct in_addr * addr );
//成功时返回1,失败返回0,
//string  IP地址的字符串形式
//addr  in_addr结构体变量的地址  

//使用方式
struct sockaddr_in addr_inet;
//赋值ip地址的时候,写法为
if(!inet_aton("192.168.0.1"),addr_inet.sin_addr)
    faial;
else
    success;
//帮助转换函数3  大端字节序的ip地址->字符串ip地址
char * inet_ntoa(struct in_addr adr);
//成功时返回字符串形式的ip地址,失败的时候返回-1

//获取本机ip地址
//服务器端自动获取本地ip地址  INADDR_ANY

char serv_port="9090";//端口的字符串形式
memset(sockaddr_in,0,sizeof(inet_addr));//必须将整个结构体设置为0
inet_addr.sin_family=AF_INET;//设置地址族
inet_addr.sin_addr=htonl(INADDR_ANY); //INADDR_ANY获取的是本机的ip地址
inet_addr.sin_port=htons(atoi(serv_port));// 
//地址结构体设置完毕
使用c/c++进行socket编程基础入门 使用c/c++进行socket编程入门 一. 编程前必备的基础知识: (1) 网络基础。你必须知道以下几点:        ①TCP/IP协议四层模型,包括物理层、IP层、TCP/UDP层和应用层。        ②我们一般所指的socket编程都是指TCP编程。由于UDP编程相对简单,而TCP的socket编程复杂得多,经常出现各种各样莫名其妙的问题,所以socket编程一般都是指TCP编程。        ③TCP与 阅读详情

相关推荐

C++ socket编程基础一(概念和常用API)

SOCKET一种进程通讯的方式,简言之就是调用这个网络库的一些API函数就能实现分布在不同主机的相关进程之间的数据交换.   SOCKET几个定义概念:   一、是IP地址: IP Address我想很容易理解,就是依照TCP/IP协议分配给本地主机的网络地址,就向两个进程要通讯,任一进程要知道通讯对方的位置,位置如何来确定,就用对方的IP 二、是端口号: 用来标识本地通讯进程,方便

蚂蚁的坚持 4122

Socket通信基础知识

Socket通信基础知识2009年03月27日 星期五 下午 01:53◆先看定义:typedef unsigned int u_int;typedef u_int SOCKET;◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。◆Sock

人的一生应当这样度过:当他回首往事时,不因虚度年华而懊悔,也不因碌碌无为而羞愧! 1354

【Socket】Java Socket编程基础及深入讲解

 Socket是Java网络编程的基础,了解还是有好处的,   这篇文章主要讲解Socket的基础编程。Socket用在哪呢,主要用在进程间,网络间通信。本篇比较长,特别做了个目录: 一、Socket通信基本示例 二、消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三、服

slw213106的博客 951

SOCKET 常用数据类型分析

1. SOCKET (套接字) typedef    UINT_PTR        SOCKET;typedef    unsigned int    UINT_PTR; 4个字节 2. sockaddr, SOCKADDR, PSOCKADDR (网络地址,通用)typedef    sockaddr    SOCKADDR, *PSOCKADDR; s

3889

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 523

STM32实战:用定时器触发ADC+DMA双缓冲实现电机电流采样(附避坑指南)

本文详细介绍了如何利用STM32的定时器触发ADC注入组采样,结合DMA双缓冲机制实现电机电流的高效采样。通过PWM触发和双缓冲架构,解决了开关噪声干扰、实时性要求和数据一致性等核心挑战,显著降低CPU负载并提升采样精度。附有完整的代码示例和避坑指南,适用于无人机电调、工业伺服驱动器等高精度电机控制场景。

weixin_33737134的博客 518

socket传输不同的数据类型

主要记录一下用socket传输不同的数据用到的各种API。方便日后查询。 1,传输数字 发送端: Socket socket = new Socket("127.0.0.1", 9099); OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.w...

hongmofang10的博客 8785

四旋翼无人机数学模型推导

本周开始进行四旋翼无人机的学习工作,首先来进行四旋翼无人机的数学模型推导工作。。 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前,首先引入坐标变换的概念,定义两个坐标系惯性坐标系{E},以及机体坐标系{B},惯性坐标系就相当于在地面建立的、静止不动的坐标系,也是我们操纵无人机所在的空间,而机体坐标系是建立于四旋翼机体之上,随着四旋翼姿态变换而变化,所以建立一种地面上的惯性坐标系与四旋翼机体坐标系之间的转换关系,就有这个必要。 对于惯性坐标系{E},以及机体坐标系{B},它们之间的转换关系

BiuBiuSun的博客 1万+

socket编程中最常用的几个数据类型和转换函数

高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换。 第一个结构类型是:struct sockaddr 该类型是用来保存socket信息的structsockaddr{  unsigned shortsa_family;  /* 地址族, AF_xxx *...

weixin_30292745的博客 350

Gazebo仿真平台模型搭建与修改

ROS里踩过的坑(一)Gazebo仿真平台模型搭建与修改文件讲解Models 文件World文件Launch文件模型编辑可视化编辑配置文件编辑模型展示如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

Redglass的博客 1万+

Unity3D Lua与C#的相互调用与性能剖析详解

在游戏开发中,经常会遇到Lua与C#之间的相互调用的情况。本文将详细介绍Unity3D中Lua与C#的相互调用的方式,并对其性能进行剖析。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!一、Lua与C#的相互调用方式Lua调用C#在Unity3D中,可以通过Lua调用C#的方式来实现Lua与C#的相互调用。具体步骤如下:(1)首先需要在Unity3D项目中导入Lua的相关库,例如tolua或者xlua。

weixin_49669470的博客 1211

一、Socket通信

Socket(套接字)是操作系统中I/O系统的延伸部分,它可以使进程和机器之间的通信成为可能。Socket实际上是一个通信端点,它包含了一个 IP 地址和一个端口号。IP 地址标识了主机,而端口号标识了主机上的进程。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

一只小鲤鱼~的博客 3213

uniApp微信小程序:利用live-pusher人脸活体检测功能+完整示例代码,uniapp使用live-pusher直播推流组件实现人脸验证-活体检测,检测人脸中的动作包括眨眼、张嘴、左右摇头动作

UniApp 使用 live-pusher 实现人脸活体检测(附完整源码)uniapp开发微信小程序人脸检测活体检测,在uni-app的微信小程序项目中使用live-pusher实现人脸识别,uniapp使用live-pusher实现模拟人脸识别效果,张张嘴、眨眨眼、向左摇头、向右摇头等动作,免费使用人脸活体检测的插件方案,uniapp小程序怎么免费使用人脸活体,直播推流,UNIAPP微信小程序使用live-pusher实现人脸识别(拍照)功能,在uni-app项目中实现人脸识别,既使用uni-app中的l

✅ 精选推荐文章 3013

Socket 编程基础

套接字(socket)是 Linux 下的一种进程间通信机制(socket IPC),在前面的内容中已经给大家提到过,使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台主机上的不同应用程序。socket IPC 通常使用客户端服务器这种模式完成通信,多个客户端可以同时连接到服务器中,与服务器之间完成数据交互。内核向应用层提供了 socket 接口,对于应用程序开发人员来说,我们只需要调用 socket 接口开发自己的应用程序即可!

Bit_Dong的博客 3万+

OpenHands:开源AI智能体开发平台实战指南与架构解析

AI智能体(Agent)作为人工智能领域的关键技术,通过模拟人类的推理与行动循环,能够自主规划并执行复杂任务。其核心原理基于ReAct(Reasoning and Acting)框架,结合规划、工具使用与记忆系统,实现了从感知到决策的闭环。在软件工程领域,AI智能体的技术价值在于将自然语言指令转化为具体的开发操作,从而显著提升代码生成、测试编写和系统维护的效率。典型的应用场景包括自动化代码重构、智能文档生成以及持续集成流程的优化。本文聚焦于OpenHands这一开源AI驱动开发平台,它提供了完整的智能体SD

weixin_27021789的博客 456

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1181

Linux下Socket编程基础

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

cooler_water的博客 2543

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Socket编程详解

Socket中文意思是“插座”,在Linux环境下,用于表示进程x间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是文件主要应用于本地持久化数据的读写,而套接字多应用于网络进程间数据的传递。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一

qq_51654808的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

socket编程基础

一、socket编程常用接口 二、sockaddr结构 三、网络字节序 四、IP格式转换函数 五、socket收发数据函数 六、基于UDP进行socket编程 七、基于TCP进行socket编程 八、三次握手和socket接口的关系 九、四次挥手和和socket的关系...

sqjddb的博客 1772

ssm框架搭建

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

Linux网络编程——socket 通信基础

socket 本身有“ 插座 ”的意思,在 Linux 环境下,用于表示 进程间网络通信 的 特殊文件类型。本质为 内核 借助 缓冲区 形成的 伪文件。既然是文件,那么理所当然的,我们可以使用 文件描述符 引用套接字。与管道类似的,Linux 系统将其封装成文件的目的是为了 统一接口,使得 读写套接字 和 读写文件 的操作一致。区别是 管道 主要应用于 本地进程间通信,而 套接字 多应用于 网络进程间数据的传递。

weixin_43412762的博客 3473

Socket网络编程基础

本机进程所使用进程号来区分不同的进程。进程间的通信方式有管道、信号、消息队列、共享内存、信号量等。而网络中进程间通信,首先需要知道进程所在的主机,即网络中唯一的标识即网络层的IP地址,主机上的进程可以通过传输层的协议和端口号识别。

only_tian的博客 2461

Socket编程基础(一)

目录   一、Socket编程知识点   二、网络基础知识     2.1、计算机网络通信     2.2、TCP/IP协议     2.3、IP地址/端口     2.4、JAVA中的网络支持 一、Socket编程知识点 * 1、网络基础知识 * 2、InetAddress类 * 3、URL * 4、TCP编程 * 5、UDP编程 一、So...

qi85481455的博客 453

《网络安全编程基础》之Socket编程

自己疏忽原因,在前面加上即可~至此,编译终于成功通过orz...

2401_88858891的博客 1218

【网络编程基础(一)】网络基础和SOCKET

TCP/IP协议族,TCP和UDP协议的优缺点,SOCKET TCP 、UDP通信过程中SOCKET API函数调用次序

paidaxing_s的博客 1336

socket 编程基础

本文深入探讨了网络通信的核心概念与技术实现。文章首先明确了网络通信的本质是跨主机的进程间通信,阐述了IP地址标识主机、端口号标识进程的双重定位机制,以及通过"IP+端口"的套接字(Socket)实现精确数据交付的原理。详细讲解了传输层TCP和UDP协议的特性差异,TCP提供可靠连接服务而UDP提供无连接简单服务。特别强调了网络字节序(大端)的统一规定及其转换函数(htonl/ntohl等)的重要性,确保异构系统间的正确通信。最后解析了socket编程接口的设计哲学,通过sockaddr结

Small_entreprene的博客 972

一、Socket编程

Socket编程 Socket编程是网络编程最常用的手段,单纯要应用socket编程事实上不需要了解计算机网络那么多的知识,我们只需要知道两个概念: IP地址可以唯一的标识一台计算机。 端口号可以唯一的标识计算机中的某一网络进程。 这两个概念都不完全严谨,但在不了解太多网络知识的前提下我们可以先认为这是对的。 IP地址可以认为是我们现实生活中的一个身份证,通过身份证号我们可以唯一的在我们国家找到一个人。也就是说,如果我们知道某一台计算机的IP地址,那么我们就可以在全国那么多台计算机中找到我们要进行通信的

qq_45926015的博客 945
上一篇: 关于c++观察者模式的理解
下一篇: (二)关于套接字的断开操作--半关闭
CallMeSumo
博客等级 码龄10年 82粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值