ucos下建立socket服务器端,接受多个连接

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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值