注 :未经允许请勿转载,请尊重劳动成果,大家都是知识分子!谢谢各位大佬赏脸!
实验器材:
硬件:原子的STM32F429阿波罗开发板
软件:STM32CUBEMX,MDK5,网络调试助手
在上一篇讲到了如何创建一个基于freeRTOS操作系统的LWIP的工程,详情请见上一篇博客!
今天主要是记录一下,如何用socket搭建TCP服务器
在STM32CUBEMX上配置硬件电路的就略过。
下面是程序部分:
#include <lwip/sockets.h>
#include <lwip/err.h>
#include <lwip/sys.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "gpio.h"
#include "usart.h"
#define SERVER_PORT 40080
uint8_t counter[100];
char socket_server_recbuff[300];
char socket_server_sendbuff[300];
static void socket_server_thread(void *p_arg)
{
struct sockaddr_in server_addr;
struct sockaddr_in connect_addr;
int socket; /* 定义 套接字*/
int socket_connect; /* 请求套接字 */
socklen_t addr_len;
int err;
int length;
int count;
socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
err = bind(socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (err < 0)
{
closesocket(socket); //关闭套接字
}
err = listen(socket, 1);
if (err < 0)
{
closesocket(socket); //close the socket
}
addr_len = sizeof(struct sockaddr_in);
socket_connect = accept(socket, (struct sockaddr *)&connect_addr, &addr_len);
if(socket_connect<0)
{
closesocket(socket);
}
else send(socket_connect, "success to connect!\n\r", 20, 0);
while (1)
{
memset(counter, 0, sizeof(counter));
length = recv(socket_connect, (unsigned int *)counter, 100, 0);
for(count=0;count<100;count++)
{
//socket_server_recbuff[count]=counter[count];
send(length, "success to accpet the data!\n\r", 20, 0);
send(socket_connect,(uint8_t *)&counter,sizeof(counter), 1);
}
}
}
void socket_server_init(void)
{
sys_thread_new("socket_server_thread", socket_server_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO - 1);
}
这个程序的实现了最基本的功能是,客户端发送什么消息,服务器端就回复什么消息,接下来打开网络调试助手,设置相应的IP地址和端口(端口的地址小于65536就OK,建议大于2000,其他随意设,只要没被占用)。在设置完之后点击连接,就OK了。
我从客户端发送123,服务器就会给我回复123,这样就搞定啦。
(文章出自:build_oooxf)