gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:58:08 29 4
gpt4 key购买 nike

我是 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com