|
楼主 |
发表于 2018-2-2 11:51:53
|
显示全部楼层
本帖最后由 dandelion 于 2018-2-2 11:53 编辑
管理员,你好!现在用RL-TCPnet在F429上用BSD Socekt 做了两个TCP客户端任务,一个TCP服务端任务。优先级都一样,用了时间片轮转,时间为5ms。
目前:
1.两个客户端都能连接上服务器,但是连接上之后,只有一个客户端能够发送数据,另一个客户端无法发送数据。
2.电脑上的客户端第一次连接上单片机的TCP服务器时,无法发送数据,第二次连接上时,两个单片机上的客户端任务都能够发送接收数据,服务器任务也正常了。
3.客户端在调用connect连接服务器时,工作在阻塞模式,等待通信建立,若服务器不存在则会立即返回。我的服务器IP存在,但是没开启,这时候connect应该是处于阻塞模式吧?会不断重连?重连次数和时间是否是Net_Config.c文件下TCP Sockets配置的Number of Retries和Retry Timeout in seconds?下面这个是我的客户端和服务端程序
void Client_TCPnet(uint8_t IP1, uint8_t IP2, uint8_t IP3, uint8_t IP4, uint16_t serverPort)
{
int sock, result, recvlen;
unsigned long sck_mode;
SOCKADDR_IN remoteaddr;
char DataBuffer[512];
char ClientCmdBuffer[64];
char ClientDataBuffer[512];
OS_ERR err;
CPU_TS ts;
OS_FLAGS xResult;
const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
while(1)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
sck_mode = 1;
result = ioctlsocket(sock, FIO_KEEP_ALIVE, &sck_mode);
if(result == SCK_SUCCESS)
{
printf_debug("KEEP_ALIVE 设置成功\r\n");
}
else
{
printf_debug("KEEP_ALIVE 设置失败\r\n");
}
/* 端口号设置*/
remoteaddr.sin_port = htons(serverPort);
remoteaddr.sin_family = PF_INET;
remoteaddr.sin_addr.s_b1 = IP1;
remoteaddr.sin_addr.s_b2 = IP2;
remoteaddr.sin_addr.s_b3 = IP3;
remoteaddr.sin_addr.s_b4 = IP4;
/* 客户端连接服务器,若远程服务器还未创建,此函数会立即返回 */
result = connect (sock, (SOCKADDR *)&remoteaddr, sizeof (remoteaddr));
printf_debug("客户端连接远程服务器,状态为%s\r\n", ReVal_Table[abs(result)]);
// if(result == SCK_ECLOSED)
// {
// closesocket(sock);
// }
// else
{
while(1)
{
//上传的是数据,接收到的是命令
memset(ClientDataBuffer, '\0', sizeof(ClientDataBuffer));
OSMutexPend((OS_MUTEX *)&BrokenDataMutex,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
BrokenData_to_String(ClientDataBuffer, s_BrokenData,1);
(void)OSMutexPost((OS_MUTEX *)&BrokenDataMutex,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&err);
printf_debug(" 客户任务将上传数据:%s\r\n",ClientDataBuffer);
result = send (sock, (char *)ClientDataBuffer, strlen(ClientDataBuffer), 0);
if (result < 0)
{
printf_debug("客户端发送数据失败%s\r\n", ReVal_Table[abs(result)]);
if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
{
break;
}
}
else
{
printf_debug("客户端发送数据成功 = %d字节\r\n", result);
}
memset(ClientCmdBuffer, '\0', sizeof(ClientCmdBuffer));
result = recv (sock, ClientCmdBuffer, sizeof(ClientCmdBuffer), MSG_DONTWAIT);
if (result <= 0)
{
printf_debug("客户端接收函数返回状态%s\r\n", ReVal_Table[abs(result)]);
// break;
if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
{
break;
}
}
else
{
printf_debug("客户端接受到数据,长度为 %d 字节\r\n", result);
printf_debug("客户端接受到数据 %s\r\n", ClientCmdBuffer);
OSMutexPend((OS_MUTEX *)&CmdDataMutex,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
Cmdparse(ClientCmdBuffer, s_ControlCmd);
(void)OSMutexPost((OS_MUTEX *)&CmdDataMutex,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&err);
OSFlagPost ((OS_FLAG_GRP *)&Sync_Data_Group,
(OS_FLAGS )CLOSEBALLASTSYNC,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
}
OSTimeDlyHMSM(0u, 0u, 1u, 0u ,OS_OPT_TIME_HMSM_STRICT,&err);
}
closesocket (sock);
}
OSTimeDlyHMSM(0u, 0u, 1u, 0u ,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
/*
*********************************************************************************************************
* 函 数 名: Server_TCPnet
* 功能说明: 服务器时使用
* 形 参: localPort: 服务器端口号
* 返 回 值: 无
*********************************************************************************************************
*/
void Server_TCPnet(uint16_t localPort)
{
char DataBuffer[512];
char ServerDataBuffer[512];
char ServerCmdBuffer[64];
OS_ERR err;
CPU_TS ts;
OS_FLAGS xResult;
const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
uint32_t recvlen;
int len;
int listensock, acceptsock, result;
SOCKADDR_IN localaddr,remoteaddr;
uint8_t recvMachineNum = MACHINENUMA;
while(1)
{
listensock = socket(AF_INET, SOCK_STREAM, 0);
localaddr.sin_port = htons(localPort);
localaddr.sin_family = PF_INET;
localaddr.sin_addr.s_addr = INADDR_ANY;
bind(listensock, (SOCKADDR *)&localaddr, sizeof(localaddr));
listen(listensock,1);
len = sizeof(remoteaddr);
acceptsock = accept(listensock, (SOCKADDR *)&remoteaddr, &len);
printf_debug("acceptsock = %d\r\n",acceptsock);
printf_debug ("远程客户端请求连接服务器,客户端IP: %d.%d.%d.%d\n", remoteaddr.sin_addr.s_b1,
remoteaddr.sin_addr.s_b2,
remoteaddr.sin_addr.s_b3,
remoteaddr.sin_addr.s_b4);
printf_debug ("远程客户端端口号: %d\n", ntohs(remoteaddr.sin_port));
recvMachineNum = (remoteaddr.sin_addr.s_b4) % 10;//当前是哪个机子的数据发送过来
closesocket (listensock);
//传给显示屏的是数据,收到的是命令
while(1)
{
memset(DataBuffer, '\0', strlen(DataBuffer));
result = recv(acceptsock, DataBuffer,sizeof(DataBuffer), MSG_DONTWAIT);
// if((result <= 0)&&(result != -4))
if((result <= 0))
{
// printf_debug("退出服务器接收函数,重新开始监听%s\r\n",ReVal_Table[abs(result)]);
if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
{
break;
}
}
else
{
memset(ServerDataBuffer, '\0', strlen(ServerDataBuffer));
printf_debug("服务器接收到数据,长度为 %d 字节\r\n",result);
// OSMutexPend((OS_MUTEX *)&ServerRecvMutex,
// (OS_TICK )0u,
// (OS_OPT )OS_OPT_PEND_BLOCKING,
// (CPU_TS *)0,
// (OS_ERR *)&err);
recvlen = judge_buffer(DataBuffer, ServerDataBuffer);
// (void)OSMutexPost((OS_MUTEX *)&ServerRecvMutex,
// (OS_OPT )OS_OPT_POST_1,
// (OS_ERR *)&err);
if(recvlen != 0)
{
printf_debug("服务器收到数据:%s\r\n",ServerDataBuffer);
OSMutexPend((OS_MUTEX *)&BrokenDataMutex,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
//将收到的数据转换为sBroType格式
buffer_to_BrokenData(ServerDataBuffer, s_BrokenData, recvMachineNum);
(void)OSMutexPost((OS_MUTEX *)&BrokenDataMutex,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&err);
}
}
xResult = OSFlagPend ((OS_FLAG_GRP *)&Sync_Data_Group,
(OS_FLAGS )CLOSEBALLASTSYNC,
(OS_TICK )usMaxBlockTime,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME,
(CPU_TS *)&ts,
(OS_ERR *)&err);
if((err == OS_ERR_NONE) )
{
memset(ServerCmdBuffer, '\0', strlen(ServerCmdBuffer));
OSMutexPend((OS_MUTEX *)&CmdDataMutex,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
Cmdencode(ServerCmdBuffer, s_ControlCmd);
(void)OSMutexPost((OS_MUTEX *)&CmdDataMutex,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&err);
printf_debug("服务器下发命令:%s\r\n",ServerCmdBuffer);
result = send (acceptsock, (char *)ServerCmdBuffer, strlen(ServerCmdBuffer), 0);
if (result < 0)
{
printf_debug("服务器发送数据失败%s\r\n", ReVal_Table[abs(result)]);
if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
{
break;
}
}
else
{
printf_debug("服务器发送数据成功 = %d字节\r\n", result);
}
}
OSTimeDlyHMSM(0u, 0u, 0u, 200u ,OS_OPT_TIME_HMSM_STRICT,&err);
}
closesocket (acceptsock);
//OSTimeDlyHMSM(0u, 4u, 0u, 00u ,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
|
|