STM32实验及结果 —— (011)Linux非阻塞TCP
»
(001)HAL库LED点灯
(002)HAL库LCD帧动画
(003)HAL库FFT动态频谱
(004)HAL库FFT Speed Up
(005)HAL库认识DMA
(006)看门狗总结
(007)GPIO使用步骤
(008)CubeIDE实现USB外设*
(009)为什么C99
(010)Linux UDP广播注意事项
(011)Linux非阻塞TCP
(012)ARM架构防烧脚本
(013)OpenWrt交叉编译
(014)C99基本数据类型
(015)C99 结构体
(016)C99 枚举
(017)C99 的函数及左值右值
(018)C99 的指针*
(019)C99 只有值赋值,没有move*
(020)C99 数组及结构体中的数组存储空间
(021)C99标准函数库没有函数模板
(022)POSIX线程库pthread的同步锁*
(023)POSIX线程库pthread的多线程*
(024)C99的条件语句
(025)C99的选择语句
(026)C99的循环语句
(027)C99标准库中的计时与等待 *
(028)C语言中的高精度计算库GMP *
(029)C语言中的Web服务*
(030)C语言中的字符转码ICU*
(031)从几个方面显然C语言比C++效率高*
(032)C99中的弱函数weak
(033)MTU TCP SOCKET
(034)STM32 UART连续发送数据函数
(035)STM32 UART连续接收数据函数
(036)STM32重定向printf输出到USART的方法
(037)STM32 Normal与Circle
(038)STM32 UART传输错误标志位的清除
(039)STM32 UART传输空闲中断
(040)STM32 串口、RS232是单根线发数据
(041)STM32 RS485差分信号通信
(042)STM32 等待DMA传输完成指定的字节数
(043)STM32进入低功耗模式
(044)DMA传输完成中断需要清空TCx标志位
(045)单字节中断HAL_UART_RxCpltCallback
(046)在单字节完成中断中处理Idle
(046)C99内置宏
🍓(001)关闭交换分区
🍓(002)格式化U盘为ext4并设定块大小为1k
🍓(003)获取linux版本信息及硬件架构信息
🍓(004)最新版Ubuntu加速
🍓(005)不稳定网络克隆360浏览器内核脚本
🍓(006)Ubuntu24.04无法运行firefox注意事项
🍓(007)MAC地址
🍓(008)RMII和PHY
🍓(009)Ubuntu Server防火墙配置
🍓(010)Linux主动让出CPU
🍓(011)Linux硬件概念
🍓(012)Linux系统中的进程间通信
🕹️(001)while(1){}不会让出CPU
🕹️(002)FreeRTOS主要函数
🕹️(003)FreeRTOS临界区ENTER_CRITICAL
🕹️(004)FreeRTOS NULL未定义问题的解决
🕹️(005)优先级最低的ARM硬件中断PENDSV
🕹️(006)任务优先级层数配置
🕹️(007)不同优先级任务创建注意事项
🕹️(008)关闭同级任务的时间片轮转
🕹️(009)OTA技术
🕹️(010)FreeRTOS静态任务创建
🕹️(011)FreeRTOS列出任务列表
🕹️(012)FreeRTOS堆空间使用量统计
🕹️(013)FreeRTOS通过任务名获取TaskHandle
🕹️(014)FreeRTOS常用任务创建方式
🕹️(015)FreeRTOS解决优先级反转的任务死锁
🕹️(016)FreeRTOS超级中断:SVC
🕹️(017)FreeRTOS中断处理函数运行在特权级
🕹️(018)FreeRTOS SVC进入用户模式的方法
🕹️(019)FreeRTOS实现绝对时间间隔开始任务
🕹️(020)FreeRTOS低功耗通过Tickless实现
🕹️(021)FreeRTOS IdleHook
🕹️(022)FreeRTOS Hooks
🕹️(023)FreeRTOS主动让出CPU
🕹️(024)FreeRTOS信号量
🕹️(025)FreeRTOS解决优先级反转问题的方法
🕹️(026)FreeRTOS获得任务的优先级
🕹️(027)FreeRTOS设置任务的优先级
🕹️(028)FreeRTOS中函数的前缀
🕹️(029)硬件中断中不能调用FreeRTOS的函数
🕹️(030)底半操作的任务接收信号量处理数据
🕹️(031)启用无限期等待
🕹️(032)中断处理函数中调用FreeRTOS的函数
🕹️(033)对于FreeRTOS顶半与底半操作的原则
🕹️(034)STM32中的FATFS支持exFat
🕹️(035)FreeRTOS中的消息队列
🕹️(036)FreeRTOS中的定时任务
🕹️(037)默认生成代码没法ping板子的原因
🕹️(038)LwIP Tcp Server开发例程
    非阻塞SOCKET的实现要点只有一个:要在SOCKET连接建立后,再设置非阻塞,而非一开始就设置非阻塞。如果一开始就设置非阻塞,之后再去连接,则SOCKET没法建立。

    ***************************************************************************************************
    创建socket,TCP(SOCK_STREAM)/IP(IPPROTO_IP)函数:sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 创建失败:sock_fd < 0
    设置socket连接特性函数(设置TCP_NODELAY为1,立即发送数据):setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, &trueVal, sizeof(trueVal)); 调用失败:返回值 < 0
    设置socket连接特性函数(设置SO_KEEPALIVE为1,触发保活机制,可用配置项:TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT):setsockopt(sock_fd, SOL_SOCKET, SO_KEEPALIVE, &trueVal, sizeof(trueVal))); 调用失败:返回值 < 0
    设置socket连接特性函数(设置SO_NOSIGPIPE为1,在BSD, MacOSX系统上关闭SIGPIPE,防止写入已经关闭的fd时程序被挂起):setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, &trueVal, sizeof(trueVal)); 调用失败:返回值 < 0
    =============================================================================
    设置socket连接特性函数(设置SOCKET关闭时的特性SO_linger):
    struct linger so_linger;
    so_linger.l_nooff = TRUE;
    so_linger.l_linger = 30;
    setsockopt(sock_fd, SOL_SOCKET,SO_LINGER,&so_linger,sizeof(so_linger));
    =============================================================================
    TRUE,30,只要so_linger为on并且等待时间大于0(单位:秒),则close时将始终阻塞等待 l_linger 秒 时间
    如果在等待过程中,TCP模块成功发送完残留缓冲区的数据,则close返回0表示成功
    如果未能成功发送完成,则close返回-1,并将errno设置为EWOULDBLOCK
    =============================================================================
    如果so_linger设置为off,则close时会立即返回
    如果close返回为0则表示成功
    如果返回为-1,则errno中为错误原因
    =============================================================================


    ***************************************************************************************************
    sockaddr_in(socket address ip number)结构体的用法:
    struct sockaddr_in server_addr;
    memset((void*)&server_addr,0,sizeof(server_addr));
    server_addr.sin_family=AF_INET;                            //IP地址为IPv4
    server_addr.sin_addr.s_addr=inet_addr(server_ip);  //服务器端IP地址,server_ip为const char*
    server_addr.sin_port=htons(server_port);                //服务器端端口,server_port为int
    其中,struct sockaddr_in结构体中的server_addr.sin_zero为IPv6数据留白
    连接到目标服务器:connect(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));调用失败:返回值 < 0
    ***************************************************************************************************

    连接建立后,设置非阻塞模式(如果先设置非阻塞后连接,则无法建立连接):
    flags = fcntl(sock_fd, F_GETFL);
    if (flags == -1 || fcntl(sock_fd, F_SETFL, (long)(flags | O_NONBLOCK)) == -1) {
        printf("Socket Error: Set O_NONBLOCK error\n");
        goto err;
    }
    ***************************************************************************************************    
    关闭socket连接:close(sock_fd);

    在socket的设置中还有两个很有用的设置项,那就是用于IP穿透的SO_REUSEADDR和SO_REUSEPORT,也就是当以客户端方式建立连接后,再重用此地址和端口建立Server服务,以方便穿透的连接请求进入当前服务。
    当然,SO_REUSEADDR还用在服务器程序的监听程序的进程重启而用于服务的子进程不中断的重启服务过程。
«
——张人杰·www.v-signon.com学习者共勉
返回上一页
备案号:京ICP备19038994号-2
个人作品网站:www.up-task.com 主办:个人 English
免责声明:本网站3d地球模型购买自3d.3d66.com,如权利人发现存在误传其作品情形,请及时与本站联系。