W5500开发笔记 | 02 - 使用W5500 Socket API 建立TCP服务端、TCP客户端-3. 实现代码
最编程
2024-08-12 17:42:44
...
编写demo文件tcp_server.c
:
#include "socket.h"
#include <stdio.h>
#define DATA_BUF_SIZE 2048
static uint8_t recv_buf[DATA_BUF_SIZE];
int tcp_server(uint8_t sn, uint16_t port)
{
int8_t ret;
uint8_t dest_ip[4];
uint16_t dest_port;
uint16_t size = 0;
switch (getSn_SR(sn)) {
case SOCK_CLOSED:
/* open socket */
printf("TCP server start\r\n");
if ((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) {
printf("socket %d open fail\r\n", sn);
return ret;
}
printf("socket %d open success\r\n", sn);
break;
case SOCK_INIT:
/* waiting for a client to connect */
printf("listen %d port...\r\n", port);
if ((ret = listen(sn)) != SOCK_OK) {
printf("%d:listen fail\r\n", sn);
return ret;
}
printf("%d:listen success\r\n", sn);
break;
case SOCK_ESTABLISHED:
/* socket has been established */
if(getSn_IR(sn) & Sn_IR_CON) {
getSn_DIPR(sn, dest_ip);
dest_port = getSn_DPORT(sn);
printf("%d:a client connect success, %d.%d.%d.%d:%d\r\n", sn, dest_ip[0], dest_ip[1], dest_ip[2], dest_ip[3], dest_port);
setSn_IR(sn,Sn_IR_CON);
}
// get the size of recv data in recv buffer
if ((size = getSn_RX_RSR(sn)) > 0) {
if (size > DATA_BUF_SIZE) {
size = DATA_BUF_SIZE;
}
//recv data
ret = recv(sn, recv_buf, DATA_BUF_SIZE);
if (ret <= 0) {
printf("%d:recv fail\r\n", sn);
return ret;
} else {
// The actual received size
size = (uint16_t)ret;
printf("%d:recv size:%d\r\n", sn, size);
recv_buf[size] = '\0';
printf("%d:recv data:[%s]\r\n", sn, recv_buf);
}
//send resp data
ret = send(sn, recv_buf, size);
if (ret <= 0) {
printf("%d:send fail\r\n", sn);
//close the socket
close(sn);
return ret;
} else {
// The actual sent size
size = (uint16_t)ret;
printf("%d:send size:%d\r\n", sn, size);
recv_buf[size] = '\0';
printf("%d:send data:[%s]\r\n", sn, recv_buf);
}
}
break;
case SOCK_CLOSE_WAIT:
/* closing the socket */
if ((ret = disconnect(sn)) != SOCK_OK) {
printf("%d:disconnect fail\r\n", sn);
return ret;
}
printf("%d: socket is closed\r\n", sn);
break;
default:
break;
}
return 0;
}
推荐阅读
-
每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理
-
二、代码实现YUV420图像的水平拼接
-
如何实现neon优化的yuv420转rgb24汇编代码,iOS/Android可用的具体操作步骤
-
将YUV420图像转换为BGR图像的方法使用OpenCvSharp实现
-
在uyuv转换为planar yuv420的过程中所使用的方法进行记录
-
图像处理:从YUV420到RGB格式的转换(含代码)
-
使用OpenGL渲染YUV数据的方法
-
编译Android 使用的 libx264 并使用进行 H.264 编码
-
Opencv实现yuv420P格式的读取
-
两种方法将YUV420P文件转换为PNG图像格式的Python实现