c - 为什么不接受()阻止?

标签 c linux sockets tcp

我是 Linux (UNIX) 套接字下套接字编程的新手。 我在 Internet 上找到了以下代码,用于为每个连接生成一个线程的 tcp 服务器。 但是它不起作用。 accept() 函数立即返回,不等待连接。 我做错了什么?

这是代码

int main(int argv, char *args[])
{
    struct sockaddr_in addr;
    int sd, port;

    port = htons(SERVER_PORT);

    /*--- create socket ---*/
    sd = socket(PF_INET, SOCK_STREAM, 0);
    if ( sd < 0 )
        panic("socket");

    /*--- bind port/address to socket ---*/
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = port;
    addr.sin_addr.s_addr = INADDR_ANY;                   /* any interface */
    if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 )
        panic("bind");

    /*--- make into listener with 10 slots ---*/
    if ( listen(sd, 10) != 0 )
        panic("listen")

    /*--- begin waiting for connections ---*/
    else
    {   int sd;
        pthread_t child;
        FILE *fp;

        while (1)                         /* process all incoming clients */
        {
            sd = accept(sd, 0, 0);     /* accept connection */
            fp = fdopen(sd, "wr+");           /* convert into FILE* */
            pthread_create(&child, 0, servlet, fp);       /* start thread */
            pthread_detach(child);                      /* don't track it */
        }
    }
} 

最佳答案

您正在追踪 sd变量,将无效套接字传递给 accept()这会导致它立即失败。

它可能会返回 EBADF发出错误的文件描述符信号。如果您检查代码中的返回值,您就会注意到。

您应该启用更多编译器警告,以捕获此类事件。使用 GCC,您可以使用 <a href="http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wshadow-395" rel="noreferrer noopener nofollow">-Wshadow</a>启用此类警告的选项。

关于c - 为什么不接受()阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218188/

相关文章:

c - 无法写入堆栈(堆栈溢出)

c - 使用 C 程序来计算字符、单词、句子、行或以上所有内容。

c - 启动时是否将整个静态程序加载到内存中?

linux - Bash脚本复制无名文件夹

c - Accept() 如何确定返回哪个整数?

c - 动态数组 C

linux - 在 linux-redhat 上安装旧版本的 gcc

linux - 使用 dlopen 重新加载动态库时如何将全局变量保留在动态库中

php - stream_socket_client 通过 http 代理

javascript - 为什么我没有收到新套接字用户连接的 console.log?