gpt4 book ai didi

c - 自己写的web服务器不能被别人的电脑访问

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:59 24 4
gpt4 key购买 nike

我用 C 语言写了一个网络服务器。我可以在 http://myhostname:protnum/index.html

访问服务器

但是当我用 friend 的电脑访问同一个地址时,却提示无法访问该网页。

文件是 webserv.c,服务器是用 ./webserv 12345 启动的(在终端中)

为什么我 friend 的电脑无法访问服务器?以下是 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_ANY 是表示 0 的更好方式。

关于c - 自己写的web服务器不能被别人的电脑访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18201680/

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