K60 Lwip TCP Server实现
来源:互联网 发布:mac手绘软件 编辑:程序博客网 时间:2024/05/16 10:34
K60 Lwip TCP Server实现
本实现基于硬件:Freescale MK60DN512VLQ10+RT-Thread 1.2.0+Lwip 1.4.1
引用
#include <lwip/netdb.h> /* 为了解析主机名称,使用netdb.h*/#include <lwip/sockets.h> /* 使用BSD socket,使用sockets.h*/
定义一些需要使用的变量:
char *recv_data;struct hostent *host;int sock, bytes_received,sock_back;struct sockaddr_in server_addr,local_addr,client_addr;char* remoteServerAddr = "172.1.1.144"; /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */host = gethostbyname(remoteServerAddr);
/* 分配用于存放接收数据的缓冲 */ recv_data = rt_malloc(BUFSZ); if (recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; }
创建Socket
/* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ if ((sock = socket(AF_INET, SOCK_STREAM, 6)) == -1) { /* 创建socket失败 */ UART_printf("Socket error in Thread4\n"); /* 释放接收缓冲 */ rt_free(recv_data); return; }
初始化本地Socket应该具有的信息
/*local_addr Tcp Socket init */local_addr.sin_family = AF_INET;local_addr.sin_port = htons(localTcpPort);local_addr.sin_addr.s_addr = INADDR_ANY;rt_memset(&(local_addr.sin_zero),0, sizeof(local_addr.sin_zero));
绑定Socket
/* bind local tcp client socket*/ if (bind(sock,(struct sockaddr *)&local_addr, sizeof(struct sockaddr)) == -1) { UART_printf("Bind error\n"); return; }else{ UART_printf("Socket Server Binded to %s:%d\n",inet_ntoa(local_addr.sin_addr),ntohs(local_addr.sin_port)); }
在Socket上监听
/* 在socket上进行监听 */ if (listen(sock, 5) == -1) { rt_kprintf("Listen error\n"); /* release recv buffer */ rt_free(recv_data); return; }
开始处理监听的到的连接
while(1){ UART_printf("\nTCPServer Waiting for client on port 61018...\n"); sin_size = sizeof(struct sockaddr_in); /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */ connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); /* 返回的是连接成功的socket */ /* 接受返回的client_addr指向了客户端的地址信息 */ UART_printf("I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); while(1) { /* 从connected连接中接收最大BUFSZ - 1字节数据 */ bytes_received = recv(connected, recv_data, BUFSZ - 1, 0); if (bytes_received <= 0) { /* 接收失败,关闭这个连接 */ /* 此段为Client关闭连接时调用 */ lwip_close(connected); UART_printf("Close connected:%d\n",lwip_close(connected)); /*返回到外层while继续监听新的连接,并accept*/ break; } /* 串口输出收到的数据 */ UART_printf("\n(%s , %d) said : ",inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port)); //UART_printf("%s", recv_data); for(uartOutCnt = 0; uartOutCnt<bytes_received; uartOutCnt++){ UART_printf("%x", recv_data[uartOutCnt]); } /* 发送数据到sock连接 */ send(connected,send_data,strlen(send_data), 0); }}
经测试以上代码可以正常工作。在Server被Client连接后,Client可以中断之后再次连接。
拔出网线、再次插回后依旧可以正常工作
0 0
- K60 Lwip TCP Server实现
- lwip raw tcp/client 实现
- lwip下TCP客户端的实现
- lwip+ucos+STM32实现HTTP Server
- lwIP――TCP/IP协议栈的一种实现
- lwIP――TCP/IP协议栈的一种实现
- lwIP TCP/IP协议栈的设计与实现
- TCP的核心算法在lwip中的实现
- 轻量级TCP/IP实现包Lwip之ARP
- lwip tcp编程
- LWIP之TCP通信
- LWIP之TCP
- LwIP之TCP
- SocketServer 实现 tcp server
- LwIP协议栈源码详解——TCP/IP协议的实现 TCP定时器
- lwIP(TCP/IP)小知识
- lwIP RAW TCP/IP接口
- lwIP RAW TCP/IP接口 .
- 基于ZigBee和STM32的智能家居控制系统的设计与实现(三)
- BIX/CRP15490高级全自动心肺复苏模拟人
- SpringMVC中的拦截器
- Wireshark网络分析实战笔记(四)高级信息统计工具的用法
- HashMap两种遍历方式
- K60 Lwip TCP Server实现
- JQuery学习第一天
- 打印1到最大的n位数 ,给 3 ,打出1,2,3,.....999
- Junit4常用注解
- sql server 把多行合并一行,并连接成一个字符串
- 一个很简单的后退到上一步的思路
- 有序数组:>奇数在前 偶数在后
- 用迭代器指向类型声明变量
- java 字符串转成 json 数组并且遍历