C 其他';s计算机
我用C语言编写了一个web服务器。我可以访问C 其他';s计算机,c,sockets,web,C,Sockets,Web,我用C语言编写了一个web服务器。我可以访问http://myhostname:protnum/index.html 但是当我用我朋友的电脑访问同一个地址时,它说我不能访问这个网页 文件为webserv.c,服务器启动时使用./webserv 12345(在终端中) 为什么我的朋友计算机不能访问服务器? 以下是webserv.c文件: int main(int argc, char const *argv[]) { int sock, fd; FILE *fpin; ch
http://myhostname:protnum/index.html
但是当我用我朋友的电脑访问同一个地址时,它说我不能访问这个网页
文件为webserv.c,服务器启动时使用./webserv 12345(在终端中)
为什么我的朋友计算机不能访问服务器?
以下是webserv.c文件:
int main(int argc, char const *argv[])
{
int sock, fd;
FILE *fpin;
char request[BUFSIZ];
if (argc == 1) {
fprintf(stderr, "usage: ws portnum\n");
exit(1);
}
sock = make_server_socket( atoi(argv[1]) );
if (sock == -1)
exit(2);
/*main loop here*/
while (1) {
/*take a call and buffer it*/
fd = accept(sock, NULL, NULL);
fpin = fdopen(fd, "r");
/*read request*/
fgets(request, BUFSIZ, fpin);
printf("Got a call: request = %s", request);
read_til_crnl(fpin);
/*do what client asks*/
process_rq(request, fd);
fclose(fpin);
}
return 0;
}
int make_server_socket_q(int portnum, int backlog)
{
struct sockaddr_in saddr;
struct hostent *hp;
char hostname[HOSTLEN];
int sock_id;
sock_id = socket(PF_INET, SOCK_STREAM, 0);
if (sock_id == -1)
return -1;
/*build address abd bind it to socket*/
bzero((void *)&saddr, sizeof(saddr));
gethostname(hostname, HOSTLEN);
hp = gethostbyname(hostname);
bcopy((void *)hp->h_addr, (void *)&saddr.sin_addr, hp->h_length);
saddr.sin_port = htons(portnum);
saddr.sin_family = AF_INET;
if (bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0)
return -1;
if (listen(sock_id, backlog) != 0)
return -1;
return sock_id;
}
void process_rq(char *request, int fd)
{
char cmd[BUFSIZ], arg[BUFSIZ];
/*create a new process and return if not the child*/
if (fork() != 0)
return;
strcpy(arg, "./");
if (sscanf(request, "%s%s", cmd, arg+2) !=2)
return;
if (strcmp(cmd, "GET") != 0)
cannot_do(fd);
else if (not_exist(arg))
do_404(arg, fd);
else if (isadir(arg))
do_ls(arg, fd);
else if (ends_in_cgi(arg))
do_exec(arg, fd);
else
do_cat(arg, fd);
}
一个常见的错误是在创建侦听套接字时使用了错误的地址。如果您从
127.0.0.1
收听,则只接受本地连接。您应该收听0.0.0.0
,以允许从任何IP地址进行连接
要在我过去使用过的windows代码中实现这一点
addr.sin_family = AF_INET;
addr.sin_port = ...;
addr.sin_addr.s_addr = 0;
但是似乎
INADDR\u ANY
是说0
当你的朋友尝试连接时,你的程序是否打印了“接到电话”?另外,一些函数,如make\u server\u socket
或process\u rq
没有发布,可能很重要。不,当我的朋友尝试连接时,我的程序不会打印任何内容@Paul运行服务器的计算机如何连接到internet?是无线的吗?在连接到有线连接之前,它是否连接到某种家庭路由器盒?我已经添加了两个功能的代码。@PaulIs your friend your访问正确的IP地址和端口?你能告诉我这台机器在哪里吗?我怎么知道我在哪里听?“我该怎么做呢?”也许胡会引用罗伯特对这个问题的评论。是的。您可以下载从代码开始的精简版本,只添加所需的头并删除对未定义函数的调用。此代码在服务于其他计算机(包括我的手机wifi)时运行良好;您可以使用gcc-Wall-O2-owebserver-webserver.c
编译它,因为没有执行任何类型的错误检查,所以会出现一些警告。还请记住,如果您不将放在SO_REUSEADDR
中,那么在停止web服务器后无法快速重新运行它。它仍然不工作。你的发球站在哪个港口?一种解释是,我的计算机有一个防火墙,它阻止了与服务器正在使用的端口的连接。如果是这样,我该怎么办?我使用ubuntu 12.04LTS@6502