随笔 - 34  文章 - 0  评论 - 0  阅读 - 3307

套接字通信

TCP 通信流程

TCP 是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。

  • 面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
  • 安全:tcp 通信过程中,会对发送的每一数据包都会进行校验,如果发现数据丢失,会自动重传
  • 流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致

                                                      

socket是插座,TCP客户端是插头,服务器先启动才能启动客户端

4.1 服务器端通信流程

1.创建用于监听的套接字,这个套接字是一个文件描述符

int lfd = socket();

监听是服务器用来检测有没有客户端发起一个新的连接,客户端和服务器的连接是由客户端发起,服务器需要通过一个套接字用来监测有没有新的客户端连接,

文件描述符是用来文件操作的。网络通信是网络IO(操作的内存)。磁盘文件的读写是文件IO(操作的磁盘文件)。

2.将得到的监听的文件描述符和本地的 IP 端口进行绑定

bind();

IP用来定位某一台主机,端口用来定位主机里的某一个进程。进程是服务器里的进程。

客户端在发数据的时候需要发送到服务器进程绑定的IP对应的端口上,这样客户端发送的数据就能被服务器的进程接收到。

3.设置监听

 

 

3.3 sockaddr 数据结构

 

 

复制代码
// 在写数据的时候不好用
struct sockaddr {
    sa_family_t sa_family;       // 地址族协议, ipv4
    char        sa_data[14];     // 端口(2字节) + IP地址(4字节) + 填充(8字节)
}

typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))

struct in_addr
{
    in_addr_t s_addr;
};  

// sizeof(struct sockaddr) == sizeof(struct sockaddr_in)
struct sockaddr_in
{
    sa_family_t sin_family;        /* 地址族协议: AF_INET */
    in_port_t sin_port;         /* 端口, 2字节-> 大端  */
    struct in_addr sin_addr;    /* IP地址, 4字节 -> 大端  */
    /* 填充 8字节 */
    unsigned char sin_zero[sizeof (struct sockaddr) - sizeof(sin_family) -
               sizeof (in_port_t) - sizeof (struct in_addr)];
};  
复制代码

注意:存IP和端口的时候一定要先转换成大端然后再把大端数据存储到结构体成员里

 

posted on   ccxwyyjy  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示