void CProtocol::RcvData(void)
{
int rxlen=0;
while(1)
{
NeatenCommBuf(&m_RecBuf);
printf("\n before recv\n");
rxlen = recv(conn.fd, (char *)(m_RecBuf.pBuf+m_RecBuf.wWritePtr),m_RecBuf.wBufSize-m_RecBuf.wWritePtr, 0);
printf("\n recv len = %d",rxlen);
led_toggle(PIO_0_BASE,LED_RX,1);/*open rx led*/
iRxledSt = 1;
if(rxlen > 0)
{
//tcp_count = TCPCOUNTMAX;
m_RecBuf.wWritePtr += (WORD)rxlen;
if (m_RecBuf.wWritePtr > m_RecBuf.wBufSize)
{
printf("\nNo empty buffer writePtr=%d\n",m_RecBuf.wWritePtr);
m_RecBuf.wWritePtr = 0;
}
DoReceive();
}
else if(rxlen <= 0)//recv=0 对端发出断开命令
{
//tcp_count = -1;
printf("\nrxlen = %d\n",rxlen);
CloseTcp();
return;
}
}
}
void SSSSimpleSocketServerTask()
{
int fd_listen;
struct sockaddr_in addr;
INT8U error_code;
if ((fd_listen = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Socket creation failed");
}
addr.sin_family = AF_INET;
addr.sin_port = htons(SSS_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if ((bind(fd_listen,(struct sockaddr *)&addr,sizeof(addr))) < 0)
{
alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Bind failed");
}
if ((listen(fd_listen,1)) < 0)
{
alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Listen failed");
}
printf("[sss_task] Simple Socket Server listening on port %d\n", SSS_PORT);
iLedSocketStatus = 0;
while(1)
{
//定义客户端的socket地址结构client_addr
struct sockaddr_in client_addr;
int length = sizeof(client_addr);
int new_server_socket = accept(fd_listen,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0)
{
alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_handle_accept] accept failed");
continue;
}
else
{
iLedSocketStatus = 1;
//tcp_count = TCPCOUNTMAX;
printf("[sss_handle_accept] accepted connection request from %s :%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);
}
#ifdef INCLUDE_GB104_S
Gb104RcvDataPri((void *)new_server_socket);
#endif
#ifdef INCLUDE_MODBUS_S
int ConnID = 0;
for(ConnID=0; ConnID<CONN_MAX; ConnID++)
{
if(wConn[ConnID] != 0xffff)
{
wConn[ConnID] = 0xffff;
break;
}
}
if(ConnID == CONN_MAX)
{
close(new_server_socket);
continue;
}
TaskPara stru_TaskPa;
stru_TaskPa.acceptSocket = new_server_socket;
stru_TaskPa.taskPri = GB104_EV_TASK_PRIORITY + ConnID + 1;
error_code = OSTaskCreateExt(ModbussRcvDataPri,
(void *)&stru_TaskPa,
(void *)&UserTaskStk[ConnID][TASK_STACKSIZE-1],
stru_TaskPa.taskPri,
stru_TaskPa.taskPri,
UserTaskStk[ConnID],
TASK_STACKSIZE,
NULL,
0);
alt_uCOSIIErrorHandler(error_code, 0);
#endif
OSTimeDlyHMSM(0,0,0,50);
}
}
ucos下建立socket服务器端,接受多个连接
最新推荐文章于 2024-08-28 14:40:28 发布