为什么不接受()阻止?

时间:2013-01-08 15:19:25

标签: 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 */
        }
    }
} 

5 个答案:

答案 0 :(得分:5)

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

它可能会返回EBADF来表示错误的文件描述符。如果您在代码中检查了返回值,您会注意到。

您应该启用更多编译器警告,以捕获这些内容。使用GCC,您可以使用-Wshadow选项启用此类警告。

答案 1 :(得分:2)

您没有检查accept()来电的返回值。很可能它会返回一个错误。

答案 2 :(得分:2)

重新定义了sd变量

int sd;

答案 3 :(得分:0)

一些问题:

1)你在恐慌中缺少一个逗号(“听”)

2)你宣布“sd”两次(一次在main()一次在其他地方)

#include <stdio.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>

#define SERVER_PORT 30000

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

    /*--- 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 */

    bind(sd, (struct sockaddr*)&addr, sizeof(addr));

    /*--- make into listener with 10 slots ---*/
    listen(sd, 10);

    /*--- begin waiting for connections ---*/
    pthread_t child;
    FILE *fp;

    while (1)                         /* process all incoming clients */
    {
        printf("before accept\n");
        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 */
        printf("After accept\n");
    }

} 

答案 4 :(得分:0)

他们是对变量sd的重新定义。

int sd; // at line 3 and 26