2016-10-20 62 views
0

程序:TCP服务器和浏览器作为Web客户机

//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连接。但它不起作用。任何人都可以解释为什么它是这样的 ?

+0

当您使用浏览器时,您没有看到“Connection accepted ....”消息吗?请使用tcpdump来查看线路上发生了什么 – Prabhu

回答

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"; 

其次是任何你想要的浏览器呈现。

解决了部分问题,我不知道为什么你不能在服务器端看到浏览器请求(通常是“GET/HTTP/1.1”或类似的东西),我会尝试更改服务器不会在单个请求(放入一个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); 
} 
+0

仍不起作用...在发送标题之前,它会启动连接。连接建立后,只有它发送标题。 – mrg