lwip 基于select方式实现的tcp简易客户端

2023-05-16

#include "sock_api/sock_api.h"
void tcp_server_test(void *arg)
{
	struct sockaddr_in sin;  /* bind socket address */
	socklen_t   sinlen;     /* length of address */
    fd_set  readfds;
	fd_set  errofds;
	struct timeval timeo;
	int     ret;
	int fd;
	struct sockaddr_in addr;
	int reuse;

	//申请一个套接字
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0){
		printf("\n >>>>>> socket error\n");
        return;
	}

	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof(int)) < 0)
	{
		printf("\n >>>>>> setsockopt SO_REUSEADDR error\n");
        return;
	}


	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr("192.168.1.101");
	addr.sin_port = htons(5200);

  /* 连接到服务端 */
    if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
        printf("\n >>>>>> connect error\n");
        return;
    }

    //获取当前描述符的flag
    int opts;
    opts=fcntl(fd, F_GETFL, 0);
    if(opts<0)
    {
		printf("\n >>>>>> F_GETFL error\n");
		return;
    }
	//设置当前描述符为非阻塞方式
    opts = opts | O_NONBLOCK;
    if(fcntl(fd,F_SETFL,opts)<0)
    {
		printf("\n >>>>>> F_SETFL error\n");
		return;
    }


    while(1){
        FD_ZERO(&readfds);
		FD_SET(fd, &readfds);
		FD_ZERO(&errofds);
		FD_SET(fd, &errofds);
		timeo.tv_sec = 1;
		timeo.tv_usec = 1000 * 10;//设置超时时间
		ret = select(fd + 1, &readfds, (fd_set *)0, &errofds, &timeo );
		if (ret == 0){//返回值等于0表示超时
            continue;
		}
		else if (ret < 0){//返回值小于于0表示出错
			printf("\n >>>>>> ret = %d\n",ret);
			break;
		}
		if (FD_ISSET(fd, &errofds))
		{
			printf("\n >>>>>> exit ok!\n");
			break;
		}

		sinlen = sizeof(sin);
		if (FD_ISSET(fd, &readfds))
		{
            char buf[128];
            ret = recv(fd,buf,sizeof(buf),0);
            if(ret <= 0){
               printf("\n >>>>>> exit ok!\n");
                break;
            }
            put_buf(buf,ret);
		}
    }
}



int sock_test(void)
{
    thread_fork("tcp_server_test", 18, 0x2E00, 64, 0, tcp_server_test, NULL);
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lwip 基于select方式实现的tcp简易客户端 的相关文章

  • 嵌入式常用模块之——环形队列(1)

    简单聊聊对我实现方式的介绍代码部分完整代码 简单聊聊 在嵌入式开发时候 xff0c 有很对模块是经常会使用到的 从这篇文字开始 xff0c 将我觉得一些常用的模块逐一做一个整理 梳理一下自己的思路 xff0c 也顺便方便大家 xff0c 如
  • Python实现isbn查询书籍详细信息

    如有错误 xff0c 请疯狂打脸没关系 xff0c 希望能够指出来 0 开始的开始 一直想做一个图书漂流软件 xff0c 最近入手 xff08 入坑 xff09 了微信小程序 xff0c 添加图书时需要用到isbn查询书籍信息的API xf
  • Ubuntu 安装 ROS 详细教程

    最近需要用ROS控制一个小车底盘 xff0c 然后发现不会了 所以写一篇博客记录一下 xff0c 以便以后查阅 OS xff1a Ubuntu 20 04 ROS xff1a noetic 1 设置Ubuntu的软件和更新 在搜索框输入so
  • roscore报错: ‘ascii’ codec can’t decode byte 0xe6 in position 13: ordinal not in range(128)

    零 问题描述 使用ROS是 xff0c 执行roscore报一下错误 xff1a ascii codec can t decode byte 0xe6 in position 13 ordinal not in range 128 The
  • Ubuntu16.04网络连接正常但浏览器无网络

    ubuntu xff0c google浏览器突然不能上网了 xff0c 经过一番折腾 xff0c 终于解决了问题 xff0c 在此记录一下 开始如下图 xff1a 然而 ping 一下百度 xff0c 是可以 ping 通的 xff0c 说
  • CMake学习(二) —— 生成链接库

    除使用 add executable 生成可执行文件外 xff0c 还可以使用 add library 生成链接库 一 Linux的链接库 首先讲一下 linux 的链接库 xff0c 就是一些函数代码的二进制形式 xff0c 有动态与静态
  • iperf3 使用指南

    iperf3的参数 xff1a s表示做服务器 c表示做客户端 t 表示表示发送时间 i 表示间隔多久报告一次 u 表示UDP xff0c 不加表示tcp R 表示服务器发客户端收 xff0c 不加默认客户端发 xff0c 服务器收 f 表
  • [Qt 教程之开始的开始] —— 创建项目及注意事项

    Qt系列教程总目录 OS xff1a Ubuntu 16 04 IDE xff1a Qt Creator 4 11 0 Qt xff1a Qt 5 14 0 xff08 GCC 5 3 1 20160406 Red Hat 5 3 1 6
  • Tips for Qt

    Based on Qt 5 14 0 Qt Creator 4 11 0 1 在UI设计界面添加控件后 xff0c 要编译一下 xff0c 再到编辑界面写代码 xff0c 否则系统不识别新添加的控件 2 多看帮助文档 xff0c 好多开发时
  • [Qt 实战小项目] —— C++ Qt 实现鼠标拖动旋转功能

    Qt系列教程总目录 文章目录 零 开始的开始一 实现思路1 旋转角度2 旋转方向3 实现旋转4 实现流程 二 完整代码 零 开始的开始 这是律盘 xff0c 看古琴课程时 xff0c 老师有一个纸质的 xff0c 可以查找各弦散按音位 xf
  • ERROR: cannot download default sources list from: 20-default.list. Website may be down.

    零 问题描述 安装 ROS 时 xff0c 执行 sudo rosdep init 报如下错误 xff1a ERROR cannot download default sources list from https raw githubus
  • ROS与操作系统版本对应关系

    Ubuntu和ROS1版本对应关系及官方支持结束时间 xff0c 加粗的为还在支持的版本 xff0c Recommended 为官方建议使用版本 UbuntuROS1Release dateEnd of Life14 04 LTSindig
  • ROS Topic 相关API接口与命令行介绍

    目录 一 Topic1 1 常用函数接口ros Publisher类ros Subscriber类 1 2 常用命令行工具rostopic相关1 2 1 rostopic bw1 2 2 rostopic delay1 2 3 rostop
  • ROS Service 相关API接口与命令行介绍

    目录 二 Service2 1 常用函数接口ros ServiceClient类ros ServiceServer类 2 2 常用命令行工具rosservice相关2 2 1 rosservice call2 2 2 rosservice
  • [Eigen中文文档] 将STL容器与Eigen一起使用

    文档总目录 本文目录 摘要使用对齐分配器std vector 的情况另一种选择 为 Eigen 类型特殊化 std vector 英文原文 Using STL Containers with Eigen 摘要 同样 xff0c 如果使用足够
  • [Eigen中文文档] 按值将Eigen对象传递给函数

    文档总目录 本文目录 按值传递和按引用传递Eigen的处理 英文原文 Passing Eigen objects by value to functions 按值传递和按引用传递 按值传递 xff1a 传入函数的参数是原始数据类型 xff0
  • [Eigen中文文档] 编译器对堆栈对齐做出了错误的假设

    文档总目录 本文目录 局部解决方案全局解决方案 英文原文 Compiler making a wrong assumption on stack alignment 这是 GCC 的错误 xff0c 已在 GCC 4 5 中修复 如果遇到此
  • 基于百问网imx6ull-qemu开发板的linux驱动开发体验

    目录 1 安装kvm2 获取百问网imx6ull qemu开发镜像3 运行百问网imx6ull qemu开发镜像4 获取百问网imx6ull qemu开发板内核源码和工具链5 下载百问网快速入门资料6 设置环境变量7 为了后续编译驱动 xf
  • ubuntu 更新源详细操作步骤

    由于linux系统自带的镜像源都在国外 xff0c 国内用户下载或更新软件会比较慢 xff0c 有时是非常慢 xff0c 所以国内某些机构 xff0c 如大学 xff0c 研究院所 xff0c 就在国内建了linux的镜像源服务器供国内li
  • error LNK2019: 无法解析的外部符号

    错误描述 1 gt 11 ObjectDetection obj error LNK2019 无法解析的外部符号 public cdecl cv VideoCapture VideoCapture void 0VideoCapture 64

随机推荐