Правильный способ записи/чтения целых чисел в программировании сокетов C

Мне нужно передать целое число с сервера TCP C с помощью функции write() и получить его на клиенте с помощью функции read().

На моем сервере, скажем

int check = 0

Как я могу отправить его с помощью функции write()? Я попробовал на своем сервере:

if (write(connfd, (const char *)&check, 4)) {
    perror("Write Error");
    exit(1);
}

И на моем клиенте:

if (n = read(sockfd, &check, 4) > 0) {
    printf("ok");
}

Но этот метод не работает и кажется неестественным. Я понимаю, что мне нужно каждый раз передавать буфер, но есть ли способ ускорить процесс?

Кроме того, важно то, что мне нужно создать серверную/клиентскую программу с передачей большого количества переменных. Могу ли я передать несколько переменных одновременно?

РЕДАКТИРОВАТЬ: Когда я говорю, что это не работает, я имею в виду, что получаю «Ошибка записи: успех». connfd и sockfd были объявлены ранее следующим образом:

Сервер:

if ((connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0) {
    perror("Accept Error");
    exit(1);
}

Клиент:

if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
    fprintf(stderr,"Connect Error\n");
    exit(1);
}

person wiredmark    schedule 31.01.2015    source источник


Ответы (1)


Вы говорите, что это не работает, что вы имеете в виду?

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

Что касается вашего последнего вопроса, вы действительно можете отправить, скажем, 4 целых числа по сети, вам просто нужно скопировать их в массив байтов (массив беззнаковых символов) и указать этот массив в вызове метода write и соответствующий размер массива/данных.

person Giorgi Moniava    schedule 31.01.2015
comment
Спасибо за ответ, я обновил пост, чтобы ответить на ваш вопрос - person wiredmark; 31.01.2015
comment
@wiredmark: вы говорите, что ошибка записи: успех, но это не очевидно из вашего кода, где вы это печатаете. В любом случае, проблема, о которой вы сейчас упоминаете, может заключаться не в методах записи/чтения, а в том, как вы настраиваете инфраструктуру подключения (вот пример кода, реализующего рабочий сервер/клиент в c-возможно, вы хотите сравнить свое решение с ним: codeproject.com/Tips/834154/) . - person Giorgi Moniava; 31.01.2015
comment
Что значит не видно? Я получаю это при попытке записи с сервера на клиент (это функция perror(), которую я написал в посте) - person wiredmark; 31.01.2015
comment
@wiredmark: ну, да, но это снова говорит мне о том, что ваша проблема в другом, а не в том, как вы используете вызовы методов записи/чтения - person Giorgi Moniava; 31.01.2015