【发布时间】:2013-01-08 15:19:25
【问题描述】:
我是 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 */
}
}
}
【问题讨论】:
-
你没有检查
accept的返回值,如果是-1你没有检查errno -
好吧,吸取教训,不要相信你从网站下载的代码。甚至示例也经常失败!
-
很好,但不要忘记选择正确的答案。
-
除了
sd的影子之外,对accept()的调用会覆盖侦听套接字描述符。由于这将适用于对accept()的一个 调用,因此它肯定不会在循环中工作(如OP 的代码sn-p 所示)。