2016-10-28 246 views
-1

我正在通過在一個客戶端和服務器之間建立它們之間的套接字連接來完成這個簡單的聊天應用程序。我能夠在同一臺計算機上的兩個不同終端上運行客戶端和服務器。 現在,我如何在兩臺不同的計算機上運行客戶端和服務器? 我嘗試這樣做,我的服務器程序中的服務器機器的IP地址代替本地主機「127.0.0.1」。它沒有工作。c中的客戶端服務器聊天應用程序

有人可以讓我知道如何實現這一點。另外,如何動態傳遞IP地址和端口號?

TCP客戶端

#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。

相關問題