Как отправить массив целых чисел с клиента на сервер? - PullRequest
0 голосов
/ 28 марта 2019

Я не знаю, как отправить массив целых чисел с клиента на сервер.По некоторым причинам в фиксированный массив, который я отправляю, на стороне сервера, когда он получен, записываются только первые два значения массива.Итак, он работает для первых двух значений массива, но теперь для других, и я не знаю почему.

код клиента

#include<stdio.h>      //printf
#include<string.h>     //strlen
#include<sys/socket.h> //socket
#include<arpa/inet.h>  //inet_addr
#include <fcntl.h>     //for open
#include <unistd.h>    //for close

#include <sys/types.h>  //sendto
#include <sys/socket.h> //sendto

#define DEFAULT_BUFLEN      512
#define DEFAULT_CLIENT_PORT     27016
#define DEFAULT_SERVER_PORT     27015
#define NUM_OF_PAR      7

int main(int argc, char *argv[])
{
    int sock;
    struct sockaddr_in server, client;
    char message[DEFAULT_BUFLEN];

        //Create socket
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock == -1)
        {
            printf("Could not create socket");
        }
        puts("Socket created");

        server.sin_addr.s_addr = inet_addr("ip_address");
        server.sin_family = AF_INET;
        server.sin_port = htons(DEFAULT_SERVER_PORT);

        //Connect to remote server
        if(connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
        {
            perror("connect failed. Error");
            return 1;
        }

        puts("Connected\n");

    int array[] = {1, 12, 3, 3, 300, 5, 3};

    printf("Sending array\n");
    for(int i = 0; i < NUM_OF_PAR; i++){
        printf("%d  ", array[i]);       
    }

    if(send(sock, array, NUM_OF_PAR, 0) < 0)    
    {
        printf("\nArray is not successfully sent\n");
    }
    else
    {
        printf("\nArray is sent\n");
    }

    printf("\n");

        close(sock);

        return 0;
}

серверкод

#include<stdio.h>   //printf    
#include<string.h>  //strlen
#include<sys/socket.h>  //socket
#include<arpa/inet.h>   //inet_addr
#include<unistd.h>      //write

#include<stdlib.h>

#include <sys/types.h>  //recvfrom
#include <sys/socket.h> //recvfrom

#define DEFAULT_BUFLEN      512
#define DEFAULT_CLIENT_PORT     27016
#define DEFAULT_SERVER_PORT     27015
#define NUM_OF_PAR      7

int main(int argc , char *argv[])
{
    int socket_desc, client_sock, c, read_size;
    struct sockaddr_in server, client;
    char client_message[DEFAULT_BUFLEN];
    int sock;

    //Create socket
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_desc == -1)
    {
            printf("Could not create socket");
        }
        puts("Socket created");

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(DEFAULT_SERVER_PORT);

        //Bind
        if(bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
        {
            //print the error message
            perror("bind failed. Error");
            return 1;
        }
        puts("bind done");

        //Listen
        listen(socket_desc, 1);

        //Accept and incoming connection
        puts("Waiting for incoming connections...");
        c = sizeof(struct sockaddr_in);

        //accept connection from an incoming client
        client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
        if(client_sock < 0)
        {
            perror("accept failed");
            return 1;
        }
        puts("Connection accepted");


        //Receive a message from client
    int arrayReceived[NUM_OF_PAR];

    while((read_size = recv(client_sock, &arrayReceived, NUM_OF_PAR, 0)) > 0){
        printf("Received well\n");  
    }

    if(read_size == 0)
        {
            puts("Client disconnected");
        }
        else if(read_size == -1)
        {
            perror("recv failed");
        }

    printf("Received parameters:    \n");
    for(int i = 0; i < NUM_OF_PAR; i++)
    {
        printf("%d  ", arrayReceived[i]);
    }

    printf("\n");

        close(sock);

        return 0;
}

Я хотел бы выписать на стороне сервера все значения массива, которые я отправил с клиента.

1 Ответ

0 голосов
/ 28 марта 2019

send и recv ожидают, что аргумент размера будет дан в байтах.

Таким образом, использование NUM_OF_PAR будет работать так, как если бы вы отправляли только NUM_OF_PAR/4 целых чисел.(Одно целое число составляет 4 байта)

Чтобы исправить это, вы можете написать:

/* using the sizeof of you array */

if(send(sock, array, sizeof array, 0) < 0)    

/* ... */

while((read_size = recv(client_sock, arrayReceived, sizeof array_received, 0)) > 0){

или

/* using the size of one element in the array times the size of one element*/

if(send(sock, array, sizeof * array * NUM_OF_PAR, 0) < 0)    

/* ... */

while((read_size = recv(client_sock, arrayReceived, sizeof *array_received * NUM_OF_PAR, 0)) > 0){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...