Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 其他';s计算机_C_Sockets_Web - Fatal编程技术网

C 其他';s计算机

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

我用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;
    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