K60 Lwip TCP Server实现
2016-04-06 10:30
1126 查看
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可以中断之后再次连接。
拔出网线、再次插回后依旧可以正常工作
相关文章推荐
- TCP
- 用Java发起HTTP请求与获取状态码(含状态码列表)
- Linux C实现简单的网络聊天室
- python 获取网络时间及修改本地时间
- 网络工具wireshark和tcpdump以及netstat命令的使用
- 搭建SSL,让Apache支持Https
- HTTP Status 404 - No result defined for action com.csdhsm.struts.action.LoginAction and result error
- 写给后端程序员的HTTP缓存原理介绍
- 深入理解HTTP Session
- GetAPictureFromInternet网络编程
- SVN基于http协议
- 计算机网络知识点(一)
- http://www.blogjava.net/soken/articles/371548.html
- Android OkHttp完全解析
- Linux C高级编程——网络编程之API(5)
- 告别砸钱深挖潜力 动漫、音频、游戏重构IP新玩法
- HttpUtils工具类
- 【bzoj 1070】【codevs 2436】[SCOI2007]修车(费用流)
- HTTP请求头参数
- PHP之Http请求