当前位置: 首页 > news >正文

Th:1.1 建立连接

基础讲解

1.TCP通信流程

基于TCP通信的Socket基本流程:

1.1 Socket

函数返回值:一个文件描述符: 特别的两个队列。

#include <sys/types.h>          
#include <sys/socket.h>
//create an endpoint for communication
int socket(
       int domain, // 协议:AF_INET (IPv4)、AF_INET6 (IPV6)....
       int type, 	// 套接字类型: SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)....
       int protocol// 协议:IPPROTO_TCP (TCP)、IPPTOTO_UDP (UDP)...; 当protocol为0时,会自动选择type类型对应的默认协议。
);
// 返回值:  返回值是一个非负整数, 代表一个文件描述符,用于标识创建的套接字,并通过这个描述符进行后续的网络I/O操作。

 setsockopt

        补充使用:防止系统断线后,重连等待!

1.2 Bind

绑定地址: 使用 bind函数 给 socket端点  绑定端口和IP (函数参考: man 2 bind)

#include <sys/types.h> 
#include <sys/socket.h>
//bind a name to a socket
int bind(
       int sockfd,					// socket端点文件描述符
       const struct sockaddr *addr,// 要绑定的IP地址和端口号
       socklen_t addrlen			// 指定的addr代表结构体长度,确保bind函数可以正确解析给定的地址信息:sizeod(addr)
);
//返回值: 成功时返回0。失败返回-1
  • const struct sockaddr *addr参数: 该参数用于提供给socket端点IP和端口信息, 但是sockaddr是一个通用的地址结构,实际使用的时候还是要使用sockaddr_in (IPv4)sockaddr_in6 (IPv6)

  • 在选择端口号设置时, 建议应当避开知名端口号的范围(<1024)。

  • 使用bind 函数时要注意其地址是大端法描述的,可能需要执行强制类型转换。

  • IP设置:

  • 当服务端设置监听IP地址时,对于IPv4,有几个特殊的IP地址可以使用:
    
    0.0.0.0
    // 表示服务端愿意接受指向服务器主机的任何IP地址的连接。
    自己主机IP
    // 无需赘述, 最正常操作
    127.0.0.1
    // 这个地址用于测试和开发,仅允许接收来自本机的回环连接。
    1.3 Listen

设置监听: 使用listen函数对设置好端口和IP的服务端socket端点监听外部连接请求 (函数参考: man 2 listen)

#include <sys/types.h>         
#include <sys/socket.h>
//listen for connections on a socket
int listen(
       int sockfd, 	// socket端点文件描述符
       int backlog		// 这个参数指定了套接字可以挂起的最大连接数
);
//返回值: 成功返回0, 失败返回-1
  • 一旦启用了listen之后,操作系统就知道该套接字是服务端的套接字,操作系统内核就不再启用其发送和接收缓冲区(回收空间),转而在内核区维护两个队列结构: 半连接队列和全连接队列。

1. 代码示例:

用户端

#include "threadPool.h"
//main.c 只调用一次 tcpInit(argv[1],argv[2],&sockfd); //连接的队列 
int tcpInit(const char *ip,const char* port, int *psockfd){ 


    //(固定用法)
    // socket ---setsockopt--- bind--- listen
    //返回值:socket() 返回一个文件描述符 *psockfd,它代表新创建的套接字,用于后续的网络操作。
    *psockfd = socket(AF_INET,SOCK_STREAM,0); //ipv4 tcp 默认tcp 0 这里的调用指针的!(生成2队列!)
   
    //(固定用法)防止Time_wait函数 不让重连
    int reuse = 1;
    int ret = setsockopt(*psockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)); 
    ERROR_CHECK(ret,-1,"setsockopt");

    // (固定用法)
    struct sockaddr_in addr; //为bind准备入参 ipv4
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(port));//端口
    addr.sin_addr.s_addr = inet_addr(ip);//ip
    ret = bind(*psockfd,(struct sockaddr *)&addr,sizeof(addr));

    //固定用法 
    ERROR_CHECK(ret,-1,"bind");
    listen(*psockfd,50); //socket 制造的队列限制
    return 0;
}

客户端

相关文章:

  • 2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析
  • Apache Iceberg 试用
  • Python学习——【4.2】数据容器:tuple元组
  • 前端web端项目运行的时候没有ip访问地址
  • Qt:NULL与nullptr的区别(手写nullptr)
  • 【Kubernetes】常见面试题汇总(二十七)
  • Mysql 视图存储过程触发器
  • Spring系统学习(一)——初识Spring框架
  • Nginx实用篇:实现负载均衡、限流与动静分离
  • JVM虚拟机基础知识
  • 线性规划------ + 案例 + Python源码求解(见文中)
  • ArrayList的扩容机制
  • Linux帮助命令
  • 地面站通过SSH连接无人机
  • Android 开发入门教程-入门基础
  • 【vue element-ui】关于删除按钮的提示框,可一键复制
  • Unity之FPS
  • 日志收集工具 Fluentd vs Fluent Bit 的区别
  • docker面经
  • 算法-深度拷贝链表(138)
  • 阿尔巴尼亚执政党连续第四次赢得议会选举,反对党此前雇用特朗普竞选经理
  • “80后”德州市接待事务中心副主任刘巍“拟进一步使用”
  • 人民日报评外卖平台被约谈:合法规范经营,公平有序竞争
  • 受美关税影响,本田预计新财年净利下降七成,并推迟加拿大建厂计划
  • 英国收紧移民政策,技术工作签证、大学招生面临更严要求
  • 他站在当代思想的地平线上,眺望浪漫主义的余晖