2016-10-20 2 views
0

Programm:TCP-Server und Browser als Web-Client in C

//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'; 
    } 
} 

Das obige Programm ist das einfache Server-Programm, das die Client-Verbindung und akzeptiert Daten übernehmen, die durch den Client gesendet wird. Ich experimentiere es mit Telnet wie unten gezeigt.

Server:

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

Auftraggeber:

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

Wenn Telnet verwendet wird, wird es richtig funktioniert. Aber meine Anforderung ist, anstatt mit Telnet zu verbinden, muss ich mit dem Browser verbinden. Ich überprüfe mit dem Browser als meinen Client wie "127.0.0.1:5000". Und ich erwarte, dass irgendeine Verbindung hergestellt wird. Aber es gibt keine Antwort und der Serverprozess hat keine Anfrage bekommen. Was ist das Problem dahinter? Warum hat der Server keine Anfrage erhalten?

Ähnlich wie Telnet, Browser auch die IP-und Port-Nummer und macht eine TCP-Verbindung. Aber es funktioniert nicht. Kann jemand erklären, warum es wie das ist?

+0

Wird die Meldung "Verbindung akzeptiert ..." nicht angezeigt, wenn Sie den Browser verwenden? Verwenden Sie tcpdump, um zu sehen, was passiert auf der Leitung – Prabhu

Antwort

0

Telnet gibt aus, was auch immer gesendet wird, aber Browser erwarten eine vollständige HTTP/1.1-Antwort, bevor sie gerendert werden. Es wäre so etwas wie dieses (Die \ r \ n heikel sind):

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

Gefolgt von was auch immer Sie wollen, dass der Browser zu machen.

Das löst einen Teil Ihres Problems, ich weiß nicht, warum Sie die Browseranforderung auf der Serverseite nicht sehen können (tipischerweise ein "GET/HTTP/1.1" oder ähnliches), ich würde versuchen, das zu ändern Server nicht nach einer einzigen Anfrage beenden (in eine while (1) Schleife einfügen und sehen, was passiert).

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

Noch funktioniert es nicht ... Vor dem Senden Header, initiiert es die Verbindung. Sobald die Verbindung hergestellt ist, sendet nur sie den Header. – mrg