2016-10-28 4 views
-1

Я делаю это простое приложение чата между одним клиентом и сервером, установив соединение сокета между ними. Я могу запустить клиент и сервер на двух разных терминалах на одном компьютере. Теперь, как я могу запустить клиент и сервер на двух разных компьютерах? Я попытался сделать это, передав IP-адрес серверного компьютера вместо локального «127.0.0.1» в серверной программе. Это не сработало.Приложение чата для клиентского сервера в c

Может кто-нибудь дать мне знать, как реализовать это. Кроме того, как я могу динамически передавать IP-адрес и номер порта?

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 сервер

#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

Вы можете передать IP и порт в качестве аргументов в 'main'. Программа должна принимать IP и порт в качестве аргументов командной строки. – Prabhu

+0

Пожалуйста, правильно отложите свой код, тогда было бы гораздо более читаемым. – alk

+0

Вы можете проверить, работает ли telnet или любая другая сетевая программа между двумя компьютерами. Существует вероятность того, что некоторые межсетевые экраны могут блокировать связь между этими двумя компьютерами. – kjohri

ответ

0

Вы имеете sockaddr_in клиента и сервера sockaddr_in в обратном направлении. Структура sockaddr_in клиента должна быть:

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

И структура sockaddr_in сервер должна быть:

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

Сейчас сервер связывает только на шлейф и ваш клиент подключается к INADDR_ANY.

Смежные вопросы