TCP服务器和浏览器作为C中的Web客户端

时间:2016-10-20 15:55:17

标签: c linux sockets unix network-programming

程序:

//Server

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<netdb.h>
void main()
{
    int fd=socket(AF_INET,SOCK_STREAM,0);

    struct sockaddr_in sa,clientaddr;
    struct in_addr ip;

    if(inet_pton(AF_INET,"127.0.0.1",&ip)!=1){
        perror("inet_pton");
        exit(1);
    }

    sa.sin_family=AF_INET;
    sa.sin_port=htons(5000);
    sa.sin_addr=ip;

    if(bind(fd,(struct sockaddr*)&sa,sizeof(sa))!=0){
        printf("Unable to Bind\n");
        perror("");
        exit(1);    
    }

    if(listen(fd,1024)!=0){
        printf("Unable to Listen \n");
        exit(1);
    }
    int len=sizeof(struct sockaddr);
    int des;
    if((des=accept(fd,(struct sockaddr*)&clientaddr,&len))<0){
        printf("Unable to accept\n");
    }
    else{
        printf("Connection accepted....\n");

        char buf[1024];

        int r=recv(des,buf,1024,0);
        printf("Recived Data: ");
        fflush(stdout);
        write(1,buf,r);
        printf("\n");
        buf[0]='\0';
    }
}

上述程序是简单的服务器程序,它接受客户端连接并接受客户端发送的数据。我试验一下 使用telnet,如下所示。

服务器:

$ ./a.out 
Connection accepted....
Recived Data: ...Hai...
$

客户端:

$ telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
...Hai...
Connection closed by foreign host.
$

使用telnet时,它已正常工作。但我的要求是不用连接telnet,我必须连接浏览器。我查一下 使用浏览器作为我的客户端,如“127.0.0.1:5000”。我希望建立任何联系。但是没有响应和服务器进程 没有得到任何要求。这背后的问题是什么?为什么服务器没有得到请求?

与telnet类似,浏览器也获取ip和端口号并建立TCP连接。但它不起作用。任何人都可以解释为什么会这样 这个 ?

1 个答案:

答案 0 :(得分:0)

Telnet将输出您发回的任何内容,但浏览器在呈现之前需要完整的HTTP / 1.1响应。 这将是这样的(\ r \ n是棘手的):

header = "HTTP/1.1 200 OK\r\n" 
         + "Content-Type: text/html;charset=UTF-8\r\n" 
         + "\r\n";

随后是您希望浏览器呈现的内容。

这解决了部分问题,我不知道为什么你无法在服务器端看到浏览器请求(原因是&#34; GET / HTTP / 1.1&#34;或者其他什么像那样),我会尝试更改服务器,不要在单个请求后退出(放入while(1)循环,看看会发生什么)。

while(1){
    if((des=accept(fd,(struct sockaddr*)&clientaddr,&len))<0){
        printf("Unable to accept\n");
    }
    else{
        printf("Connection accepted....\n");

        char buf[1024];

        int r=recv(des,buf,1024,0);
        printf("Recived Data: ");
        fflush(stdout);
        write(1,buf,r);
        printf("\n");
        buf[0]='\0';
    }
    close(des);
}