2009-05-15 LWIP之SOCKET编程

前几天看了关于LWIP协议栈的实现和FREERTOS的基本原理。今天开始调试LWIP的socket通信,是基于freertos系统的ARM9_STR91X_IAR开发板。

这是个现成的实例,由于lwip已经由freertos移植好了,而调试的目的就是实现在lwip上的socket通信。本来以为很容易的问题,结果还是搞了一天,当然和EWARM工具的难用也还是有很大关系的。

首先要注意的一点是sys_thread_new和xTaskCreate的区别。我们知道xTaskCreate是用来创建一个task任务的。类似于windows下的process。

/*

Starts a new thread with priority "prio" that will begin its execution in the

function "thread()". The "arg" argument will be passed as an argument to the

thread() function. The id of the new thread is returned. Both the id and

the priority are system dependent.

*/

sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)

{

xTaskHandle CreatedTask;

int result;

result = xTaskCreate(thread, ( signed portCHAR * ) s_sys_arch_state.cTaskName, s_sys_arch_state.nStackDepth, arg, prio, &CreatedTask );

// For each task created, store the task handle (pid) in the timers array.

// This scheme doesn't allow for threads to be deleted

timeoutlist[nextthread++].pid = CreatedTask;

if(result == pdPASS)

{

++s_sys_arch_state.nTaskCount;

return CreatedTask;

}

else

{

return NULL;

}

}

很显然,sys_thread_new最终对task的创建也是通过xTaskCreate来实现的。但是请注意不同点,前者会把新创建的task的pid放入到一个timeoutlist的链表中。

起初我也没有主要这个小问题,直到用socket系列函数的select的时候,一直过不去,而是abort中断了,具体原因请看select函数实现,其中sys_arch_timeouts的调用就是获取当前task的timeout,如果没有用sys_thread_new创建的话,这里就没有我用来调用select的当前task,所以就有了以后的abort中断了。

下面给一个socket编程的实现

static void vLWIPSendTask( void *pvParameters )

{

int listenfd;

int remotefd;

int len;

struct sockaddr_in local_addr,remote_addr;

fd_set readset;

fd_set writeset;

struct timeval timeout;

timeout.tv_sec = 1;

timeout.tv_usec = 0;

//struct lwip_socket* sock;

listenfd = socket(AF_INET,SOCK_STREAM,0);

local_addr.sin_family = AF_INET;

local_addr.sin_port = htons(80);

local_addr.sin_len = sizeof(local_addr);

local_addr.sin_addr.s_addr = INADDR_ANY;

if (bind(listenfd, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0)

{

return ;

}

if (listen(listenfd, 1) == -1)

{

return;

}

len = sizeof(remote_addr);

while(1)

{

//这里注意一下,lwip的阻塞不是在listen函数,而是accept

remotefd = accept(listenfd, (struct sockaddr *)&remote_addr, &len);

//close(listenfd);

//listenfd = -1;

//getpeername(remotefd, (struct sockaddr *)&remote_addr, &len);

if(remotefd != -1)

{

int ret;

send(remotefd,"start to work!\r\n",16,0);

for(;;)

{

FD_ZERO(&readset);

FD_ZERO(&writeset);

FD_SET(remotefd, &readset);

FD_SET(remotefd, &writeset);

ret = lwip_select(remotefd+1, &readset, &writeset, 0, &timeout);

if(ret > 0)

{

if (FD_ISSET(remotefd, &readset))

{

memset(buf,0,50);

if(recv(remotefd,buf,50,0) <= 0)

{

close(remotefd);

remotefd = -1;

break;

}

else

{

int i = strlen(buf);

send(remotefd,buf,i ,0);

}

}

/*

else if(FD_ISSET(remotefd, &writeset))

{

send(remotefd,"this is time to send!\r\n",25,0);

}

*/

}

else if(ret < 0)

{

close(remotefd);

remotefd = -1;

break;

}

}

}

}

vTaskDelete( NULL );

}

对的,这是作为server端实现的,可以和通用的socket客户端配。经过测试至少可以与windows上的socket程序匹配(接收,发送数据)。

lwip网络通信socket_LWIP之SOCKET编程相关推荐

  1. lwip网络通信socket_LWIP之SOCKET的实现

    2009-05-11LWIP之SOCKET的实现 Lwip协议栈的实现目的,无非是要上层用来实现app的socket编程.好,我们就从socket开始.为了兼容性,lwip的socket应该也是提供标 ...

  2. lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API

    http://home.eeworld.com.cn/my/space-uid-162102-blogid-52270.html 2011 原文: 关于BSD Socket API 在网上找到的两个网 ...

  3. Python C/S架构,网络通信相关名词,socket编程

    主要内容: 一.  C/S架构 二. 网络通信的相关名词 三. socket编程 一. C/S架构和B\S架构概述 1. C/S架构: Client/Server(客户端/服务端)架构 描述: C/S ...

  4. python网络通信传输的数据类型_Python Socket 编程详细介绍(转)

    Python 提供了两个基本的 socket 模块: Socket 它提供了标准的BSD Socket API. SocketServer 它提供了服务器重心,可以简化网络服务器的开发. 下面讲解下 ...

  5. LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程

    LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程 一.SAL套接字抽象层 二.Socket套接字简介 Socket概述 Socket结构体 字节序转换函数 ip地址的转换 字节 ...

  6. python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...

  7. python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系

    python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...

  8. 转Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  9. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

最新文章

  1. ElasticSearch 面试 4 连炮,你顶得住么?
  2. IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
  3. 剑指offer 04:重构二叉树
  4. javaScript tips —— z-index 对事件机制的影响
  5. 今天下午接到阔总编的电话
  6. 关于linux shell脚本开头的#!/bin/sh
  7. android制作相册浏览器_电脑上用什么软件做电子相册
  8. HBase集群安装部署(完全分布式)
  9. oracle打开scott用户_Oracle 11gR2中启动Scott用户的方法(推荐)
  10. Linux Redis 安装
  11. python数据结构之 set
  12. 消息称苹果、Epic开庭时间从2021年7月提前至5月份
  13. matlab点乘的实现
  14. Java、JSP网上零食销售系统的设计与实现
  15. 软考中级哪一门比较好过?我建议你考这个。
  16. 计算机组成原理头歌实验
  17. ubuntu离线中文语音识别
  18. 微信小程序单个页面导航栏 设置
  19. jdk,jre,jvm的包含关系
  20. 如果不能时刻保持学习的心态,那么你将被 IT 甩回开普乐星去

热门文章

  1. 在甲骨文云ARM VPS上使用宝塔导致php安装不完整的解决方法/ARM架构服务器使用宝塔可能遇见的问题的解决方法/Oracle Linux8/dns_get_record()/mime_conten
  2. 卷积神经网络之AlexNet网络模型学习
  3. Linux网络通信优化方法
  4. 数据挖掘原理与实践学习(1)
  5. 服务器显示尚未报告,wsus客户端尚未报告状态.doc
  6. jquery二级联动下拉框
  7. 在Debian下安装输入法的过程
  8. 游戏麦克风推荐— HyperX声浪加强版游戏麦克风声控+颜值党的幸运
  9. rpc是什么?php中流行的rpc框架有哪些?
  10. 买单侠 CTO 李炫熠:我在买单侠的创业经历