K60 Lwip TCP Server实现

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值