一、使用BSD Socket创建TCP SERVER
#define SOCK_PORT 1001
#define IP4_ENABLE 1
/// Stream socket server thread
static void Stream_Server (void *arg) {
int32_t sock, sd, retv;
char dbuf[4];
while (1) {
#if (IP4_ENABLE)
/* Create IPv4 socket address */
SOCKADDR_IN addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons (SOCK_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
sock = socket (AF_INET, SOCK_STREAM, 0);
retv = bind (sock, (SOCKADDR *)&addr, sizeof (addr));
#endif
#if (IP6_ENABLE)
/* Create IPv6 socket address (MDK-Pro only) */
SOCKADDR_IN6 addr6;
addr6.sin6_family = AF_INET6;
addr6.sin6_port = htons (SOCK_PORT);
addr6.sin6_flowinfo = 0;
if (!inet_pton (AF_INET6, "::", &addr6.sin6_addr)) {
/* IPv6 not supported */
for (;;);
}
sock = socket (AF_INET6, SOCK_STREAM, 0);
retv = bind (sock, (SOCKADDR *)&addr6, sizeof (addr6));
#endif
if (retv < 0) {
printf("bind error\r\n");
closesocket (sock);
continue;
}
retv = listen (sock, 1);
if (retv < 0) {
printf("listen error\r\n");
closesocket (sock);
continue;
}
printf("before accept\r\n");
sd = accept (sock, NULL, NULL);
printf("accept\r\n");
closesocket (sock);
while (1) {
retv = recv (sd, dbuf, sizeof (dbuf), 0);
if (retv <= 0) {
break;
}
if (dbuf[0] == 0x06) {
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
}
}
closesocket (sd);
}
}
注:使用BSD创建的TCP SERVER,其连接时间受以下两个参数影响
在Net_Config_BSD.h中Receive Timeout in seconds
若设置为1-600,则TCP的连接时间为1-600
若设置为0,则其连接时间由Net_Config_TCP.h的Default Connect Timeout in seconds决定。