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