【问题标题】:How to run client-servet TCP/IP program on two different machines?如何在两台不同的机器上运行客户端-服务器 TCP/IP 程序?
【发布时间】:2020-06-11 08:58:24
【问题描述】:

我在谷歌上搜索并堆栈溢出了很多,但没有找到任何解决方案。我有一个简单的回显客户端-服务器程序,其中客户端发送一个单词,服务器回显它。

这是我的 server.c 文件:

#define PORT 4444
#define MAX_CONNESSIONI 100

int main ()
{
    int serverSocket, bindStatus;
    struct sockaddr_in serverAddress;
    int clientSocket;
    struct sockaddr_in newAddress;
    char buffer[1024];
    pid_t child;
    socklen_t addrSize;
    ssize_t nread;

    // Creazione della socket
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == -1) {
        perror("[-]Errore durante la creazione della socket\n");
        exit(-1);
    }

    printf("[+]Echo-Server socket has been created\n");

    memset(&serverAddress, '\0', sizeof(serverAddress));

    // Riempimento dei campi della struct
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(PORT);
    serverAddress.sin_addr.s_addr = INADDR_ANY;

    // Binding della socket all'indirizzo specificato. Associa alla socket un indirizzo in modo da poter essere contattata dai client
    if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) {
        perror("[-]Errore durante il binding\n");
        exit(1);
    }
    printf("[+]Bind to port %d\n", PORT);


    // Imposta la socket all'ascolto. I parametri sono il descrittore della socket e la massima lunghezza della coda di connessioni entranti
    if (listen(serverSocket, MAX_CONNESSIONI) != -1) {
        printf("Listening . . .\n\n");
    }
    else {
        perror("[-]Error during listening\n");
        exit(1);
    }


    while (1) {

        // Accettazione della connessione
        clientSocket = accept(serverSocket, (struct sockaddr*)&newAddress, &addrSize);
        if (clientSocket == -1) {
            exit(-1);
        }
        printf("%s:%d joined\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port));

        child = fork();
        if (child == 0) {

            close(serverSocket);

            while (1) {

                // Ricezione del messaggio
                if ( (nread=recv(clientSocket, buffer, sizeof buffer - 1, 0)) <= 0) {
                    perror("[-]Error in receiving data from server\n");
                }
                else {
                    buffer[nread] = '\0';
                }


                if (strcmp(buffer, ":exit") == 0) {
                    printf("%s:%d left\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port));
                    break;
                }
                else {
                    printf("%s:%d wrote: %s\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port), buffer);
                    // Invio del messaggio
                    send(clientSocket, buffer, strlen(buffer), 0);
                    bzero(buffer, sizeof(buffer));
                }

            }

        }

    }

    close(clientSocket);

    return 0;
}

你可以编译它使用

gcc -o server.out server.c

并使用执行它

./server.out

这是我的 client.c 文件:

#define PORT 4444

int main ()
{
    int clientSocket;
    struct sockaddr_in serverAddress;
    char buffer[1024];
    ssize_t nread;

    // Creazione della socket
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket == -1) {
        perror("[-]Errore durante la creazione della socket\n");
        exit(-1);
    }
    printf("[+]Client socket has been created\n");


    memset(&serverAddress, '\0', sizeof(serverAddress));

    // Riempimento dei campi della struct
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(PORT);
    serverAddress.sin_addr.s_addr = INADDR_ANY;

    // Connessione
    if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) {
        perror("Errore con la connessione\n");
        exit(-1);
    }
    printf("[+]Connected to Server\n");
    printf("[+]Use single-word and :exit to logout\n");

    while (1) {

        printf("> ");
        //fgets(buffer, 1024, stdin); Per ottenere una stringa con gli spazi
        fflush(stdin);
        scanf("%s", buffer);


        // Invio dei dati al server
        if (send(clientSocket, buffer, strlen(buffer), 0) == -1) {
            perror("Errore con l'invio");
            exit(1);
        }

        // Per uscire dalla connessione
        if(strcmp(buffer, ":exit") == 0) {
            close(clientSocket);
            printf("[-]Disconnected from Server\n");
            exit(0);
        }

        // Riceve i dati dal server
        if ( (nread=recv(clientSocket, buffer, sizeof buffer - 1, 0)) <= 0) {
            perror("[-]Error in receiving data from server\n");
        }
        else {
            buffer[nread] = '\0';
            printf("Server received: %s\n", buffer);
        }

    }

    close(clientSocket);

    return 0;
}

您可以使用gcc -o client.out client.c 编译它 并使用./client.out执行它

这很好用。

  • 如何编辑才能在两台不同的计算机上执行服务器?

【问题讨论】:

    标签: c tcp client-server


    【解决方案1】:

    将 INADDR_ANY 更改为您的服务器 IP 地址。

    serverAddress.sin_addr.s_addr = inet_addr("192.168.1.20");
    

    【讨论】:

    • 如果我不知道我的服务器 IP 地址是什么?
    • 没有服务器IP就无法建立连接。您必须知道在哪里连接。套接字不够智能,无法确定它必须连接的服务器 IP。
    • @Sasi 我认为你不理解他的问题。他谈到了“服务器套接字”。您可以使用htonl (INADDR_ANY); 将服务器套接字绑定到所有可用接口,请参阅:stackoverflow.com/questions/16508685/…。不习惯使用固定 IP 地址,因为这不太适合 DHCP 模式...
    • @Sasi 你谈到了 server.cclient.cserverAddress.sin_addr.s_addr = INADDR_ANY; 吗? client.c 的那个是假的,因为我们必须指出我们要建立连接的服务器的确切地址。
    • 他的问题是关于客户的。我的回答也是关于客户的。我说阅读他的客户程序,即client.c
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2017-05-26
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    相关资源
    最近更新 更多