2013-09-21 50 views
0

我有一個服務器/ CLient套接字編程模型的問題。在同一臺計算機上,我有一臺服務器運行在一個程序上,客戶端運行另一臺程序。服務器/客戶端通過地址0.0.0.0和端口3000進行通信。通信正常。但是,當我有服務器程序運行一個系統和運行在另一個系統上的客戶端程序(兩臺不同的計算機,並且它們都支持Wifi)時,Socket編程模型不再適用於我了。套接字編程只適用於同一系統,不適用於不同的系統

這是爲什麼?

portno=30000; 
    serv_addr.sin_family = AF_INET; 


    char *srvr_addr=NULL; 
    srvr_addr="0.0.0.0"; 
    inet_addr(srvr_addr); 

    serv_addr.sin_addr.s_addr =inet_addr(srvr_addr); 

    serv_addr.sin_port = htons(portno); 
    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); 

    listen(sockfd,5); 

    while (1) 
    { 

    clilen = sizeof(cli_addr); 

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

客戶端

 int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 

    portno=3000; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 




    server = gethostbyname("0.0.0.0"); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET; 
    //source, destination 
    bcopy((char *)server->h_addr, 
      (char *)&serv_addr.sin_addr.s_addr, 
      server->h_length); 
    serv_addr.sin_port = htons(30000); 

    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    int result; 
    result=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); 

    fgets(buffer,255,stdin); 
    n = write(sockfd,buffer,strlen(buffer)); 

    bzero(buffer,256); 
    n = read(sockfd,buffer,255); 
+0

你有「還挺」給了我們服務器端的代碼。如果我在服務器端使用htonl(INADDR_ANY),防火牆/路由器等是否會與客戶端「代碼」 –

+0

@Paul一起計入公式中,那麼客戶端應該使用什麼?現在我有server = gethostbyname(「0.0.0.0」); – lilzz

+0

@lilzz:看到我的回答,無論您在服務器上使用什麼,都無法在客戶端使用「0.0.0.0」。 –

回答

2

無法跨網絡客戶端連接到IP地址0.0.0.0,那將只能在同一臺計算機上運行。你需要讓你的客戶端連接到你的服務器的真實IP地址。將服務器設置爲在"0.0.0.0"上偵聽,或者htonl(INADDR_ANY)告訴它偵聽任何可用的IP地址,但這不是網絡上的可路由地址,當您在本地使用時,它只會連接到localhost,這就是爲什麼當他們在同一臺計算機上時,它爲你工作,但當他們在不同的計算機上時不工作。運行ifconfig查找服務器計算機的真實IP地址,並讓您的客戶端連接到該服務器。

您還應該檢查所有這些函數的返回值。他們中的每一個都可能失敗,尋找問題的第一步是檢查所有人的回報,並找出哪一個出錯,以及報告的錯誤消息是什麼。

你也在使用一些漂亮的過時函數。 inet_addr()應替換爲getaddrinfo() - 雖然在這種情況下,您根本不需要它,而應該使用htonl(INADDR_ANY)替代 - 而gethostbyname()應替換爲getnameinfo()

+0

真實IP地址?我正在做點對點網絡。我沒有涉及到路由器,因此不應該包含真正的IP地址?兩個具有Wifi能力的系統應該能夠在沒有涉及路由器的情況下相互通話。沒有路由器意味着不涉及真正的IP地址。 – lilzz

+0

如果沒有涉及真正的IP地址,那麼你就不能使用TCP/IP套接字。你必須完全使用不同的通信協議。 –

+0

@lilzz - 你的代碼使用IP堆棧(贈送是「AF_INET」。因此,該網絡上的每臺計算機都有一個唯一的IP地址,0.0.0.0是回送函數。你如何向某人發送一封信 - 它需要一個物理郵遞員,或者更好的還是ADDRES –

1

爲什麼不給客戶一個戰鬥機會並給出服務器的IP地址?

而且 - 你對這些代碼summat:

即東西一樣

  • inet_addr(srvr_addr);對自己
  • 沒有使用INADDR_ANY
  • 定義端口號的變量,而不是使用它

....

+0

假設服務器有有效的IP,客戶如何找出它想連接的服務器。假設有服務器A和服務器B,客戶端如何知道服務器A的IP,並讓我們說客戶端提前不知道服務器A的IP。 – lilzz

+0

@lilzz - 你有沒有關於這一點。當你想與某人交談時,你有電話號碼,電子郵件地址,郵寄地址,網格參考,...瞭解這個主意。在這種情況下,邏輯上的事情是你知道他們的IP地址(也許通過DNS查找 - 互聯網相當於電話簿)。因此,爲什麼不用電話簿(AKA DNS)註冊計算機名稱。 –

相關問題