Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 将选择与多个套接字一起使用_Sockets_Select_Tcp_Freertos_Lwip - Fatal编程技术网

Sockets 将选择与多个套接字一起使用

Sockets 将选择与多个套接字一起使用,sockets,select,tcp,freertos,lwip,Sockets,Select,Tcp,Freertos,Lwip,我使用的lwip只有一个线程(基于FreeRTOS,我只需要一个任务)。在那里,我有两个套接字监听传入的连接。因此,我想使用select来等待传入的新连接,而且我不想在等待时阻塞。因此,在创建了两个套接字、绑定和侦听之后,我转到我的不定式循环: #define TOTAL_MASTERS 2 fd_set current_sockets, ready_sockets; struct timeval timeout;, int master1_fd, master2_fd; struct s

我使用的lwip只有一个线程(基于FreeRTOS,我只需要一个任务)。在那里,我有两个套接字监听传入的连接。因此,我想使用select来等待传入的新连接,而且我不想在等待时阻塞。因此,在创建了两个套接字、绑定和侦听之后,我转到我的不定式循环:

#define TOTAL_MASTERS   2

fd_set current_sockets, ready_sockets;
struct timeval timeout;,
int master1_fd, master2_fd;
struct sockaddr_in address;


// Master 1
if ((master1_fd = lwip_socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    xil_printf("TCP server: Error creating Socket\r\n");
    return;
}

// Set up to wait for subscribers
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port1);
address.sin_addr.s_addr = INADDR_ANY;

if (n=bind(master1_fd, (struct sockaddr *)&address, sizeof (address)) < 0) {
    port = port11;
    xil_printf("[err: %d] TCP server: Unable to bind to port %d\r\n",n, ((port&0xFF)<<8) | ((port>>8)&0xFF));
    close(sock);
    return;
}

if (n=listen(master1_fd, 1) < 0) {
    xil_printf("[err: %d] TCP server: tcp_listen failed\r\n", n);
    close(master1_fd);
    return;
}

// Master 2
if ((master2_fd = lwip_socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    xil_printf("TCP server: Error creating Socket\r\n");
    return;
}

// Set up to wait for subscribers
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port2);
address.sin_addr.s_addr = INADDR_ANY;

if (n=bind(master2_fd, (struct sockaddr *)&address, sizeof (address)) < 0) {
    port = port22;
    xil_printf("[err: %d] TCP server: Unable to bind to port %d\r\n",n, ((port&0xFF)<<8) | ((port>>8)&0xFF));
    close(sock);
    return;
}

if (n=listen(master2_fd, 1) < 0) {
    xil_printf("[err: %d] TCP server: tcp_listen failed\r\n", n);
    close(master2_fd);
    return;
}

FD_ZERO(&current_sockets);
FD_SET(master1_fd, &current_sockets);
FD_SET(master2_fd, &current_sockets);

timeout.tv_sec = 0;
timeout.tv_usec = 5000; // 5ms for timeout

while(1)
{
    FD_ZERO(&ready_sockets);
    ready_sockets = current_sockets;

    if(sret = select(TOTAL_PUBLISHERS, &current_sockets, NULL, NULL, &timeout) == 0)
    {
        //timeout
        //xil_printf("Select time out: %d\n", sret);
    }
    else
    {
        xil_printf("Something happened: %d\n", sret);
        for(int i=0; i<TOTAL_MASTERS; i++){
            if(FD_ISSET(i, &ready_sockets)){
                if(i == publisher_FPGA_ROS_mymsg.socket_to_wait_for_subscribers_fd){
                    if ((new_sd = lwip_accept(master1_fd, (struct sockaddr *)&remote, (socklen_t *)&size)) > 0){
                        if ((read_bytes = lwip_recvfrom(new_sd, message, ARR_SIZE, 0, NULL, NULL)) > 0) {
                            xil_printf("New client on master 1:\n%s", message);
                        }
                    }
                }
                if(i == publisher_FPGA_ROS_geometry_msgs_point.socket_to_wait_for_subscribers_fd){
                    if ((new_sd = lwip_accept(master2_fd, (struct sockaddr *)&remote, (socklen_t *)&size)) > 0){
                        if ((read_bytes = lwip_recvfrom(new_sd, message, ARR_SIZE, 0, NULL, NULL)) > 0) {
                            xil_printf("New client on master 2:\n%s", message);
                        }
                    }
                }
            }
        }
    }
}
#定义总计#2
fd_设置电流_插座、就绪_插座;
结构timeval超时;,
int master1_fd,master2_fd;
地址中的结构sockaddr_;
//大师1
if((master1\u fd=lwip\u套接字(AF\u INET,SOCK\u STREAM,0))<0){
xil_printf(“TCP服务器:创建套接字时出错\r\n”);
返回;
}
//设置为等待订阅服务器
memset(&address,0,sizeof(address));
address.sin_family=AF_INET;
address.sin_port=htons(端口1);
address.sin_addr.s_addr=INADDR\u ANY;
if(n=bind(master1_fd,(struct sockaddr*)和address,sizeof(address))<0){
端口=端口11;
xil_printf(“[err:%d]TCP服务器:无法绑定到端口%d\r\n”,n,((端口&0xFF)8)和0xFF));
关闭(袜子);
返回;
}
如果(n=侦听(主1_fd,1)<0){
xil\u printf(“[err:%d]TCP服务器:TCP\u侦听失败\r\n”,n);
关闭(master1_fd);
返回;
}
//大师2
if((master2\u fd=lwip\u套接字(AF\u INET,SOCK\u STREAM,0))<0){
xil_printf(“TCP服务器:创建套接字时出错\r\n”);
返回;
}
//设置为等待订阅服务器
memset(&address,0,sizeof(address));
address.sin_family=AF_INET;
address.sin_port=htons(端口2);
address.sin_addr.s_addr=INADDR\u ANY;
if(n=bind(master2_fd,(struct sockaddr*)和address,sizeof(address))<0){
端口=端口22;
xil_printf(“[err:%d]TCP服务器:无法绑定到端口%d\r\n”,n,((端口&0xFF)8)和0xFF));
关闭(袜子);
返回;
}
如果(n=侦听(master2\u fd,1)<0){
xil\u printf(“[err:%d]TCP服务器:TCP\u侦听失败\r\n”,n);
关闭(master2_fd);
返回;
}
FD_零(和电流_插座);
FD_集(主1_FD和当前_插座);
FD_集(主2_FD和当前_插座);
timeout.tv_sec=0;
timeout.tv_usec=5000;//5毫秒表示超时
而(1)
{
FD_零(和就绪_插座);
就绪\u插座=当前\u插座;
if(sret=select(总发布服务器和当前套接字、NULL、NULL和超时)==0)
{
//超时
//xil_printf(“选择超时:%d\n”,sret);
}
其他的
{
xil_printf(“发生的事情:%d\n”,sret);
对于(int i=0;i 0){
如果((read_bytes=lwip_recvfrom(new_sd,message,ARR_SIZE,0,NULL,NULL))>0){
xil_printf(“主机1上的新客户端:\n%s”,消息);
}
}
}
如果(i==发布服务器、FPGA、ROS、几何体、msgs、点、套接字、等待用户、fd){
如果((新建sd=lwip\U接受(master2\U fd,(结构sockaddr*)和远程,(socklen\u t*)和大小))>0){
如果((read_bytes=lwip_recvfrom(new_sd,message,ARR_SIZE,0,NULL,NULL))>0){
xil_printf(“主机2上的新客户端:\n%s”,消息);
}
}
}
}
}
}
}
我遇到的问题是,如果超时,它不会对传入的新客户机做出反应,但总是超时。如果我将
中的
&timeout
更改为
NULL
,则我只在master1上获得传入连接

是否可以仅使用一个线程或任务在多个套接字上等待传入连接


谢谢您的帮助。

您的代码中有许多错误

您正在混合lwip和C套接字函数。仅使用lwip函数以实现一致性

您的
bind()
listen()
select()
表达式缺少必需的括号,因为