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
Linux 在不丢失数据的情况下检测端口连接_Linux_Sockets_Tcp - Fatal编程技术网

Linux 在不丢失数据的情况下检测端口连接

Linux 在不丢失数据的情况下检测端口连接,linux,sockets,tcp,Linux,Sockets,Tcp,我一直在尝试为Linux编写一个小程序,检测端口(比如8080)上的客户端连接,并在连接完成后关闭套接字并执行某个程序 我为端口设置了套接字。 之后,我进行选择以等待传入的客户端连接 if(select(listener+1, &master, NULL, NULL, NULL) == -1) { perror("Server-select() erro!"); exit(1); } printf("Close socket...\n"); close(listener

我一直在尝试为Linux编写一个小程序,检测端口(比如8080)上的客户端连接,并在连接完成后关闭套接字并执行某个程序

我为端口设置了套接字。 之后,我进行选择以等待传入的客户端连接

if(select(listener+1, &master, NULL, NULL, NULL) == -1)
{
    perror("Server-select() erro!");
    exit(1);
}

printf("Close socket...\n");
close(listener);
在此之后,我执行一个程序,该程序将读取端口上的数据

这一切都很好,但是尝试连接的客户端第一次总是失败,因为,我猜当我关闭套接字时,从客户端发送到程序的数据丢失了。 在不丢失数据发送的情况下,是否需要等待端口连接? 我想的是不承认这种联系

当我按照建议接受()时:

{
    struct sockaddr_in clientName = { 0 };
    int slaveSocket, clientLength = sizeof(clientName);

    (void) memset(&clientName, 0,sizeof(clientName));

    slaveSocket = accept(listener,(struct sockaddr *) &clientName,&clientLength);
    if (-1 == slaveSocket)
    {
        perror("accept()");
        exit(1);
    }
}

printf("Close socket...\n");
close(listener);

if ((child = fork()) == 0) { /* Child process. */
    printf("Child: PID of Child = %ld\n", (long) getpid());
    execvp(argv[2], &argv[2]); /* arg[0] has the command name. */
    /* If the child process reaches this point, then *//* execvp must have failed.  */
    fprintf(stderr, "Child process could not do execvp.\n");
    exit(1);
} else { /* Parent process. */
    if (child == (pid_t) (-1)) {
        fprintf(stderr, "Fork failed.\n");
        exit(1);
    } else {
        c = wait(&cstatus); /* Wait for child to complete. */
        printf("Parent: Child %ld exited with status = %d\n", (long) c,
                cstatus);
    }
}
执行的shell程序失败,原因是: bind()错误(端口号:8554):地址已在使用中
因此,我想我需要以某种方式释放端口?

由于您不接受传入连接,因此在关闭侦听套接字时,端口必须关闭。您需要先调用
accept()

请参阅此示例,了解如何正确执行此操作:


您没有关闭监听插座。调用accept为传入连接获取新的fd,然后调用fork。分叉后,您可以关闭侦听套接字,并使用接受的套接字传输数据。父进程只是关闭接受的套接字并继续侦听。

您是否在某处执行了
接受
?您的问题不清楚。为什么执行程序执行
绑定()
?在我看来,您正试图在主程序中执行执行程序已经为自己执行的操作。