2016-09-30 6 views
0

Ich mache eine TCP/IP-Verbindung. Ich habe diese Codes:TCP/IP funktioniert nicht zwischen zwei Computern

server.c

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include<fcntl.h> 

int main(){ 
    int serverid, clientid, n = 0, len; 
    char msgsend[512], msgrecv[512]; 
    struct sockaddr_in server,client; 

    serverid = socket(AF_INET, SOCK_STREAM, 0); 
    if (serverid < 0) { 
    puts("Error creating socket\n"); 
    return -1; 
    } 

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

    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 
    server.sin_port = htons(5000); 

    if(bind(serverid, (struct sockaddr*)&server, sizeof(server)) < 0) { 
    printf("Error binding\n"); 
    return -1; 
    } 

    if(listen(serverid, 10) < 0){ 
    printf("ERROR"); 
    return -1; 
    } 
    len = sizeof(client); 
    clientid = accept(serverid, (struct sockaddr*)&client, &len); 
    if (clientid < 0) { 
    printf("Connection error\n"); 
    return -1; 
    } 
    puts("Connected to client"); 

    while(1){ 
    n = recv(clientid, msgrecv, sizeof(msgrecv) - 1, 0); 
    if(n < 0){ 
     printf("Error while reading...\n"); 
     return -1; 
    } 

    printf("client says:\n"); 
    msgrecv[n] = 0; 
    fputs(msgrecv, stdout); 
    printf("\n"); 
    printf("enter your reply\n"); 
    gets(msgsend); 
    send(clientid, msgsend, sizeof(msgsend) - 1, 0); 
    printf("\n"); 
    } 
    return 0; 
} 

client.c

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <fcntl.h> 

int main(){ 
    int sock, n = 0; 
    char msgsend[512], msgrecv[512]; 
    struct sockaddr_in server; 


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

    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if(sock == -1){ 
    printf("Could not create a socket!\n"); 
    return -1; 
    } 

    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = inet_addr("192.168.112.130"); 
    server.sin_port = htons(5000); 


    printf(" Trying to connect...\n"); 

    if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0){ 
    printf("Error:Connection failed\n"); 
    return -1; 
    } 
    printf("Connected\n"); 
    while(1){ 
    printf("please enter your reply\n"); 
    gets(msgsend); 

    send(sock, msgsend, sizeof(msgsend) - 1, 0); 
    n = recv(sock, msgrecv, sizeof(msgrecv) - 1, 0); 

    if(n < 0){ 
     printf("Read error\n"); 
    } 
    printf("\n"); 
    printf("server says:"); 
    msgrecv[n] = 0; 
    fputs(msgrecv, stdout); 
    printf("\n"); 
    } 
    return 0; 
} 

ich zum ersten Mal ./server laufen und dann in einem anderen Endgerät ./client. Wenn ich den gleichen Computer benutze, funktioniert es gut, aber wenn ich den Server auf einem Computer und den Client auf einem anderen verwenden möchte, verbindet er sich nie. Ich weiß nicht, was ich falsch mache. Vielleicht muss ich eine andere IP verwenden? Ein Teil des Codes muss für ausländische Computer anders sein?

Hinweis: Ein Computer ist ein Desktop mit Ethernet und der andere ist ein Laptop, der über WiFi mit demselben Router verbunden ist.

+0

Was ist das Betriebssystem auf den Computern? Wenn es Windows ist, versuchen Sie, die Firewall zu deaktivieren, wenn Linux, aktivieren Sie diesen Port auf iptables oder was auch immer Firewall es ist. Da der Server und der Client auf demselben Computer ordnungsgemäß funktionieren, liegt das Problem wahrscheinlich an einem anderen Ort. –

Antwort

0

Der allgemeine Ansatz zum Debuggen dieser Art von Zeug ist zu versuchen, in beide Richtungen zu pingen, und sehen, ob es funktioniert. Wenn nicht, müssen Sie die Konfiguration der Routing-Tabellen sowie Ihre Schnittstellen auf den Geräten und die Weiterleitung/Firewall/NAT-Einrichtung auf dem Router überprüfen. Stellen Sie sicher, dass das Pingen in beide Richtungen danach funktioniert.

Wenn das funktioniert, testen Sie, ob Sie TCP mit einem einfachen Programm wie nc oder sogar Ihrem eigenen Server verwenden können. Wenn das Pingen funktioniert, aber die TCP-Verbindung nicht, dann ist es wahrscheinlich eine Firewall-Einstellung auf einem der beteiligten Hosts, meistens auf dem Server. Passen Sie die Einstellungen an und testen Sie sie erneut. Wenn Sie nicht sicher sind, ob Ihre eigene Anwendung funktioniert, haben Sie wahrscheinlich an dieser Stelle nc verwendet, um die Verbindung zu testen, und Sie können nun mit dem Testen Ihrer Anwendung fortfahren.

Verwandte Themen