您的位置:首页 > 理论基础 > 计算机网络

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可以中断之后再次连接。

拔出网线、再次插回后依旧可以正常工作

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: