мой recv ломает мой посыл, который как раз перед - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь создать программу, которая использует сокеты между клиентом и сервером. В моем коде ниже, если я комментирую цикл, пока мой сервер получает мое сообщение, но если я не комментирую, мой клиент, похоже, не отправляет мое сообщение (наконец, мой сервер никогда не получает мое сообщение). Почему?

Сервер

int main()
{
    message = malloc(sizeof(char));
    printf("Waiting for incoming connections ...\n");
    sem_init(&lock, 0, 1);

    // socket creation
    int server_socket;
    server_socket = socket(AF_INET, SOCK_STREAM, 0);

    // dserver address9002
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);
    server_address.sin_addr.s_addr = INADDR_ANY;

    // bind the socket to IP and port
    bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
    listen(server_socket, MAX_CONNECTIONS);

    int client_socket;
    int i = 0;
    while(client_counter < 2  && (client_socket = accept(server_socket, NULL,NULL)))
    {
        client_counter++;
        client_sockets[i] = client_socket;
        i++;
        printf("new client ! \n");
    }
    //here i create a thread for each client and in this thread there is a while loop with a recv function
}

Клиент

int socket_connection(char* ip, int port)
{
    int network_socket = 0;

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(port);
    server_address.sin_addr.s_addr = inet_addr(ip);

    if ((network_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Socket creation error \n");
        return -1;
    }

    int connection_status = connect(network_socket, (struct sockaddr*) &server_address, sizeof(server_address));

    if (connection_status < 0)
    {
        printf("Error while creating / connecting the socket");
        return -1;
    }

    return network_socket;
}

void connect_to_server()
{
    char ip[256];
    int port;

    strcpy(ip, "127.0.0.1");
    port = 9002;

    // try to connect to the server with the IP and port
    int network_socket = socket_connection(ip, port);

    char server_reponse[256];
    char message[256];
    // clean string
    memset(server_reponse, 0, sizeof(server_reponse));


    recv(network_socket, &server_reponse, sizeof(server_reponse), 0);

    if (strcmp(server_reponse, "instruction: make board") == 0)
    {
        construct_game_board();
        show_game_board();

        memset(message, 0, sizeof(message));
        put_ship(message);
        printf("Finish to make board\n");
    }


    printf("Reponse send to socket %d: %zu\n",network_socket, send(network_socket, message, strlen(message), 0));

    while (1) {
        printf("Before recv\n");
        printf("Reponse recv : %zu\n", recv(network_socket, server_reponse, sizeof(server_reponse), 0));
        printf("After recv\n");
}

В моей консоли, когда я запускаю, у меня есть: Reponse send to socket 3: 0 и Before recv

...