以CH32V307为例,单片机实现单个服务器服务多个客户端实现步骤及注意事项
u8 IPAddr[4] = { 192, 168, 1, 10 }; //IP address,单片机作服务器端的IP地址
u8 GWIPAddr[4] = { 192, 168, 1, 1 }; //Gateway IP address
u8 IPMask[4] = { 255, 255, 255, 0 }; //subnet mask
u16 srcport = 1000; //source port
假设我们要使用电脑作为N个客户端,单片机作服务器端,在该函数中作修改即可:
/*********************************************************************
* @fn WCHNET_CreateTcpSocketListen
*
* @brief Create TCP Socket for Listening
*
* @return none
*/
void WCHNET_CreateTcpSocketListen(void)
{
u8 i;
u8 Num;
SOCK_INF TmpSocketInf;
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
TmpSocketInf.ProtoType = PROTO_TYPE_TCP;
for(Num=0;Num<3;Num++) /* 这里给服务器开3个端口以供客户端连接 */
{
TmpSocketInf.SourPort = srcport++;
i = WCHNET_SocketCreat(&SocketIdForListen, &TmpSocketInf);
printf("SocketIdForListen %d\r\n", SocketIdForListen);
mStopIfError(i);
i = WCHNET_SocketListen(SocketIdForListen); //listen for connections
mStopIfError(i);
}
}
接下来我们到net_config.h库文件中修改对应参数即可
/*********************************************************************
* socket configuration, IPRAW + UDP + TCP + TCP_LISTEN = number of sockets
*/
#define WCHNET_NUM_IPRAW 0 /* Number of IPRAW connections */
#define WCHNET_NUM_UDP 0 /* The number of UDP connections */
#define WCHNET_NUM_TCP 3 /* Number of TCP connections */
#define WCHNET_NUM_TCP_LISTEN 3 /* Number of TCP listening */
/* The number of sockets, the maximum is 31 */
#define WCHNET_MAX_SOCKET_NUM (WCHNET_NUM_IPRAW+WCHNET_NUM_UDP+WCHNET_NUM_TCP+WCHNET_NUM_TCP_LISTEN)
#define WCHNET_TCP_MSS 1460 /* Size of TCP MSS */
此处更改WCHNET_NUM_TCP和WCHNET_NUM_TCP_LISTEN均为3后即可实现三个客户端以不同的端点号连接同一地址的TCP服务器。
如果想要开更多客户端来连接,需要将TCP的报文长度改小些,不然会报错,比如可以更改为#define WCHNET_TCP_MSS 536,这样就可以了。