|
我是移植了lwip到UCOS上面,对RAW API控制是没有问题,我想建立TCP服务器,支持多台设备连接,一直没有找到好的办法,我想到了SOCKET API中的select函数。下面是我建立的一个任务TCP 服务器任务。
问题:可以偶尔连接,数据不能通信,但是PING 是通的。
原因:是加入了select,因为我在没有select下,可以一台设备连接,而且通信很好。大家帮我看看。
static void TCP_Multil_Test(void *parg)
{
char recv_data[50]; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */
u32_t sin_size;
int listener, connected, bytes_received;
struct sockaddr_in server_addr, client_addr;
//bool stop = FALSE; /* 停止标志 */
fd_set master; /* master file descriptor */
fd_set read_fds; /* temp file descriptor list for select */
int fdmax; /* maximum file descriptor number */
int i, j;
FD_ZERO(&master); /* clear the master and temp sets */
FD_ZERO(&read_fds);
/* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */
if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
return;
}
/* 初始化服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(4003); /* 服务端工作的端口 */
server_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
/* 绑定socket到服务端地址 */
if (bind(listener, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
return;
}
/* 在socket上进行监听 */
if (listen(listener, 10) == -1)
{
return;
}
/* add the listener to the master set */
FD_SET(listener, &master);
/* keep track of the biggest file descriptor */
fdmax = listener;
while(1)
{
read_fds = master; /* copy it */
/* block & waiting for connect or received data */
if(lwip_select(fdmax+1, &read_fds, NULL, NULL, NULL) == 0)
{
continue;
}
//UARTSend((unsigned char *)"Get select\n", 12);
for(i = 0; i <= fdmax; i++)
{
if(FD_ISSET(i, &read_fds))
{
// we got one.
if(i == listener)
{ /* handle new connections */
sin_size = sizeof(struct sockaddr_in);
/* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */
connected = accept(i, (struct sockaddr *)&client_addr, &sin_size);
/* 返回的是连接成功的socket */
if(connected == -1)
continue;
//printf("accept connect error.\n");
else
{
FD_SET(connected, &master); /* add to master set */
if(connected > fdmax) /* keep track of the max */
fdmax = connected;
UARTSend((unsigned char *)"Get Connet..\n", 14);
/* 接受返回的client_addr指向了客户端的地址信息 */
// printf("I got a connection from (%s , %d)\n",
// inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}
}
else
{ // handle data from a client
bytes_received = recv(i, recv_data, 50, 0);
if (bytes_received <= 0)
{
/* 接收失败,关闭这个connected socket */
lwip_close(i);
FD_CLR(i, &master); /* remove from master set */
continue;
}
send(i, recv_data, bytes_received, 0);
} // End of Handle data from client
} // End of new incoming connection
} // end of loop through file descriptors
} // end of while(stop != TRUE)
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|