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
原创粉丝点击