Есть ли способ реализовать двустороннюю связь TCP с использованием программирования сокетов в c? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть два файла кода, и я пытаюсь установить sh двустороннюю связь TCP. У меня есть готовая и работающая односторонняя связь, которая отправляет сообщения от клиента на сервер, а затем на сервер, распечатывает его. Я пытался установить sh двустороннее TCP-соединение, что означает, что я могу отправлять сообщения с любого компьютера.

клиент. c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>

#define SERVER_PORT 5432
#define MAX_LINE 256

int main(int argc, char * argv[])
{
    struct hostent *hp;
    struct sockaddr_in sin;
    char *host;
    char buf[MAX_LINE];
    int s;
    int len, new_s;

    if (argc==2) {
        host = argv[1];
    }
    else {
        fprintf(stderr, "usage: simplex-talk host\n");
        exit(1);
    }

    /* translate host name into peer’s IP address */
    hp = gethostbyname(host);
    if (!hp) {
        fprintf(stderr, "simplex-talk: unknown host: %s\n", host);
        exit(1);
    }

    /* build address data structure */
    bzero((char *)&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
    sin.sin_port = htons(SERVER_PORT);

    /* active open */
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        perror("simplex-talk: socket");
        exit(1);
    }

    if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        perror("simplex-talk: connect");
        close(s);
        exit(1);
    }

    /* main loop: get and send lines of text */
    /*while (fgets(buf, sizeof(buf), stdin)) {
        buf[MAX_LINE-1] = '\0';
        len = strlen(buf) + 1;
        send(s, buf, len, 0);
    }*/

    while(1){

        printf("sent: ");
        if(fgets(buf, sizeof(buf), stdin)){
            buf[MAX_LINE-1] = '\0';
            len = strlen(buf)+1;
            send(s, buf, len, 0);
        }

        if((len = recv(new_s, buf, sizeof(buf), 0)) != 0){
            printf("received: ");
            fputs(buf, stdout);

        }
    }
}

сервер. c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>

#define SERVER_PORT 5432
#define MAX_PENDING 5
#define MAX_LINE 256

int main()
{
    struct sockaddr_in sin;
    char buf[MAX_LINE];
    int len;
    int s, new_s;

    /* build address data structure */
    bzero((char *)&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(SERVER_PORT);

    /* setup passive open */
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        perror("simplex-talk: socket");
        exit(1);
    }

    if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {
        perror("simplex-talk: bind");
        exit(1);
    }

    listen(s, MAX_PENDING);

    /* wait for connection, then receive and print text */
    while(1) {
        len = sizeof(sin);
        if ((new_s = accept(s, (struct sockaddr *)&sin, (socklen_t *)&len)) < 0) {
            perror("simplex-talk: accept");
            exit(1);
        }



        while(1){

            if((len = recv(new_s, buf, sizeof(buf), 0)) != 0){
                printf("received: ");
                fputs(buf, stdout);
            }


            printf("sent: ");
            if(fgets(buf, sizeof(buf), stdin)){
                buf[MAX_LINE-1] = '\0';
                len = strlen(buf)+1;
                send(s, buf, len, 0);
            }

        }

        close(new_s);
    }
}

компиляция: gcc -o server server.c gcc -o client client.c

Выполнение программы: на стороне клиента: ./client (ip address of the server machine) на стороне сервера: ./server


Ожидаемый результат: Сторона клиента:
sent: hi
received: hello world
sent: what is your name?

Сторона сервера:

received: hi
sent: hello world
received: what is your name?


Фактический результат: Сторона клиента:
sent: hi
received: hi
sent: ^C

Сторона сервера:

received: hi
sent: hello world
...