我是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 */
}
}
}
答案 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