2016-10-28 1 views
-1

Ich mache diese einfache Chat-Anwendung zwischen einem Client und einem Server durch Herstellen der Socket-Verbindung zwischen ihnen. Ich bin in der Lage, Client und Server auf zwei verschiedenen Terminals auf demselben Computer auszuführen. Nun, wie kann ich Client und Server auf zwei verschiedenen Computern ausführen? Ich habe versucht, dies zu tun, indem ich die IP-Adresse der Servermaschine anstelle von localhost "127.0.0.1" im Serverprogramm gebe. Es hat nicht funktioniert.Client-Server-Chat-Anwendung in c

Kann mir jemand sagen, wie dies zu implementieren ist. Wie kann ich IP-Adresse und Portnummer dynamisch übergeben?

TCP Client

#include<sys/socket.h> 
#include<stdio.h> 
#include<string.h> 
#include<netdb.h> 
#include<stdlib.h> 

int main() 
{ 
    char buf[100]; 
    int k; 
    int sock_desc; 
    struct sockaddr_in client; 
    memset(&client,0,sizeof(client)); 
    sock_desc=socket(AF_INET,SOCK_STREAM,0); 

    if(sock_desc==-1) 
    { 
     printf("Error in socket creation"); 
     exit(1); 
    } 

    client.sin_family=AF_INET; 
    client.sin_addr.s_addr=INADDR_ANY; 
    client.sin_port=3002; 

    k=connect(sock_desc,(struct sockaddr*)&client,sizeof(client)); 
    if(k==-1) 
    { 
     printf("Error in connecting to server"); 
     exit(1); 
    } 

    while(1) 
    { 
     printf("\nEnter data to be send to server: "); 
     fgets(buf,100,stdin); 
     if(strncmp(buf,"end",3)==0) 
      break; 

     k=send(sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in sending"); 
      exit(1); 
     } 

     k=recv(sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in receiving"); 
      exit(1); 
     } 

     printf("Message got from server is : %s",buf); 
    } 
    close(sock_desc); 
    exit(0); 
    return 0; 
} 

TCP Server

#include<sys/socket.h> 
#include<stdio.h> 
#include<string.h> 
#include<netdb.h> 
#include<stdlib.h> 
int main() 
{ 
    char buf[100]; 
    int k; 
    socklen_t len; 
    int sock_desc,temp_sock_desc; 
    struct sockaddr_in server,client; 

    memset(&server,0,sizeof(server)); 
    memset(&client,0,sizeof(client)); 

    sock_desc=socket(AF_INET,SOCK_STREAM,0); 
    if(sock_desc==-1) 
    { 
     printf("Error in socket creation"); 
     exit(1); 
    } 

    server.sin_family=AF_INET; 
    server.sin_addr.s_addr=inet_addr("127.0.0.1"); 
    server.sin_port=3002; 

    k=bind(sock_desc,(struct sockaddr*)&server,sizeof(server)); 
    if(k==-1) 
    { 
     printf("Error in binding"); 
     exit(1); 
    } 

    k=listen(sock_desc,20); 
    if(k==-1) 
    { 
     printf("Error in listening"); 
     exit(1); 
    } 

    len=sizeof(client);//VERY IMPORTANT 
    temp_sock_desc=accept(sock_desc,(struct sockaddr*)&client,&len); 
    if(temp_sock_desc==-1) 
    { 
     printf("Error in temporary socket creation"); 
     exit(1); 
    } 

    while(1) 
    { 
     k=recv(temp_sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in receiving"); 
      exit(1); 
     } 

     printf("Message got from client is : %s",buf); 
     printf("\nEnter data to be send to client: "); 

     fgets(buf,100,stdin); 
     if(strncmp(buf,"end",3)==0) 
      break; 

     k=send(temp_sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in sending"); 
      exit(1); 
     } 
    } 
    close(temp_sock_desc); 

    exit(0); 
    return 0; 
} 
+1

Sie können die IP und den Port als Argumente an die 'main' übergeben. Das Programm soll die IP und den Port als Befehlszeilenargumente verwenden. – Prabhu

+0

Bitte setzen Sie Ihren Code richtig ein, er wäre dann viel besser lesbar. – alk

+0

Sie können testen, ob Telnet oder ein anderes Netzwerkprogramm zwischen den beiden Computern funktioniert. Es besteht die Möglichkeit, dass eine Firewall die Kommunikation zwischen den beiden Computern blockiert. – kjohri

Antwort

0

Sie haben den Client sockaddr_in und Server sockaddr_in in umgekehrter Richtung. Die sockaddr_in Struktur Kunde sollte sein:

client.sin_family=AF_INET; 
client.sin_addr.s_addr=inet_addr("add server ip here"); 
client.sin_port=3002; 

Und der Server sockaddr_in Struktur sein sollte:

server.sin_family=AF_INET; 
server.sin_addr.s_addr=INADDR_ANY; 
server.sin_port=3002; 

Gerade jetzt Ihren Server bindet nur auf Loopback und Ihr Client verbindet sich mit INADDR_ANY.