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

linux系统编程(十②)RK3568 socket之 TCP 客户端的实现

开发环境
1、讯为RK3568开发板,下载了Ubuntu系统。

2、笔记本Windows下的VScode连接开发板。

3、网线连接开发板J13网口。

VSCode远程连接开发板:https://blog.csdn.net/u012507643/article/details/152666866?spm=1011.2124.3001.6209

UDP收发的流程:
创建socket->bind->connect->sendto/recvfrom/send/recv

一、用到的函数

函数参考前面写的一片博客,这里不复制过来了

https://blog.csdn.net/u012507643/article/details/153478108?sharetype=blogdetail&sharerId=153478108&sharerefer=PC&sharesource=u012507643&spm=1011.2480.3001.8118

二、直接看实际代码

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <errno.h>int main(int argc, char *argv[])
{int fd;int conn = 0;int ret = 0;char tx_buf[1024] = {"12324"}, rx_buf[1024] = {0};struct sockaddr_in cs;//SOCK_STREAM:TCPfd = socket(AF_INET, SOCK_STREAM, 0);inet_pton(AF_INET, "192.168.31.20", &cs.sin_addr);cs.sin_family = AF_INET;cs.sin_port = htons(8080);bind(fd, (const struct sockaddr *)&cs, sizeof(cs));while(1){if (conn == 0){if (connect(fd, (const struct sockaddr *)&cs, sizeof(cs)) < 0){//printf("connect failed\n");}else{printf("connectted server\n");conn = 1;}}else{// struct tcp_info info;int len = sizeof(cs);/* 这里才是真正的数据 */ret = recv(fd, rx_buf, sizeof(rx_buf) - 1, MSG_DONTWAIT);if (ret > 0){printf("recv data:%s, len=%d\n", rx_buf, ret);// printf("input data:\n");// scanf("%s", tx_buf);if (sendto (fd, rx_buf, ret, MSG_DONTWAIT, (struct sockaddr *)&cs, sizeof(cs)) < 0){printf("server abroad\n");conn = 0;}memset(tx_buf, 0, sizeof(tx_buf));memset(rx_buf, 0 ,sizeof(rx_buf));}/* 这里仅仅作为探针,看下连接是否断开 */ret = recv(fd, rx_buf, sizeof(rx_buf) - 1, MSG_PEEK);if ((ret > 0) || ((ret == -1) && (errno == EAGAIN))){continue;}else{printf("server abroad\n");conn = 0;close(fd);fd = socket(AF_INET, SOCK_STREAM, 0);}}}close(fd);return 0;
}

三、测试结果

1、测试连接

2、测试断开重连【网络助手断开重新侦听】

3、测试收发数据

四、总结

1、这里增加判断远程是否断开:

使用recv() 函数的MSG_PEEK选项,使用这个选项可以“偷看(peek)”一下接收队列的数据。所谓“偷看”,就是recv()不从接收队列中把数据移除,因此下一次调用recv()函数还会接收到此数据。
当TCP连接处于已建立Established状态时,如果接收队列中有数据,recv()函数返回实际接收的字节数;如果接收队列中没有数据但是TCP连接没有断开,recv() 函数返回-1,并且把errno设置为EAGAIN。其余情况下表示TCP连接已经断开。

所以上面我使用了两次的recv函数,一个是接收数据用,一个是判断是否断开了。

2、重连时候需要close掉上一次的套接字描述符,否则直接connect是失败的。

由于本人也是刚学,写的不好,也不规范,有错误的地方望前辈指正,以免误入歧途。

http://www.dtcms.com/a/496118.html

相关文章:

  • 网站如何提交关键词asp网站只能打开首页
  • 门店管理网站建设wordpress 爬虫 插件
  • 提供一些准备Java八股文面试的建议
  • 详细聊一下G1垃圾回收器
  • 刷死粉网站推广c 微信小程序开发教程
  • 网站建设归工商局管还是工信局管龙游网站制作
  • MTK Router 改成抓包机器
  • 对新网站做seo大概需要多久wordpress 微网站模板
  • Vue Router 路由管理完全指南:从入门到精通前言
  • Linux 教程:如何查看服务器中各个目录占用的磁盘大小
  • Bootstrap5 轮播
  • 中国建设银行十堰分行网站陕西交通建设集团信息网站
  • 杭州杭州网站建设沈阳网络推广公司
  • Tap翻译 1.100 | 屏幕翻译软件,点击屏幕轻松翻译漫画游戏聊天消息
  • ESP32学习笔记(基于IDF):IOT应用——WIFI连接
  • 网站现状分析seo优化快速排名技术
  • 前景互联应急救援指挥平台接入大疆机场3无人机
  • python(入门)map内置函数及import模块导入,as别名
  • 做外贸的网站域名怎么买网站营销队伍
  • 【电源专题】环境温度对PPTC保持电流(Ihold)和动作电流(Itrip)的影响
  • 上海做电缆桥架的公司网站如何查网站开发商
  • 中国遵义门户网站建设银行网站 查余额
  • 十五、kubernetes 1.29 之 容忍、污点、固定节点
  • 福州企业建站软件做企业评价的有哪些网站
  • dw用设计视图做网站视频网站做推广有没有效果
  • 伪静态WordPress/Vue
  • 《理解进制问题--剖析存储底层奥秘》
  • Vue 指令详解笔记:从内置到自定义(初学者实战指南)
  • 河南网站营销seo电话灵感网站
  • seo下载站东莞网站推广优化网站