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

#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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值