читать целое число через сокет c - PullRequest
0 голосов
/ 23 июля 2011

Мне нужно прочитать целое число через сокет и почувствовать его в функции.я делаю

strcpy(out,"insert id messagge\n");
if (write(sd_client,out, sizeof(out))==-1){
    printf("Error.\n");
    }
while ((read(sd_client, &id, sizeof(int)))==-1){  //id is an integer
        if(errno!=EINTR){
    printf("Error.\n");
        exit(-1);
    }
}
messaggio2(sd_client, logi, atoi(id)); //atoi(id) try to send int to func

кто-нибудь может мне помочь, пожалуйста?: D

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Второй параметр read и write - это указатель на данные.

Когда вы говорите:

write(sd_client,out, sizeof(out))

вы передаете значение из.Это должно быть:

write(sd_client, &out, sizeof(out))

Кроме того, я думаю, что вы объявили id как int (что правильно), так почему вы передаете его в atoi?Эта функция предназначена для анализа int из строки.

0 голосов
/ 23 июля 2011

Проблема, с которой вы столкнулись, кажется немного неопределенной, поскольку вы на самом деле не упомянули ошибки, которые вы получаете, но из кода, который вы опубликовали, кажется, что вы столкнулись с двумя различными проблемами:

  1. atoi() предназначен для преобразования строкового значения в целое число ... теперь кажется, что у вас уже есть целое число в значении id, поэтому аргумент atoi() неверен.Вам просто нужно использовать что-то вроде sprintf() или snprintf(), чтобы преобразовать ваше целочисленное значение в строковое значение, а затем скопировать его в определяемый пользователем строковый буфер, если вы хотите получить строковое представление целого числа.
  2. Вы работаете с сокетами, поэтому любая информация, передаваемая по сети, будет поступать в порядке сетевых байтов.Если вы используете платформу с прямым порядком байтов, то целое число будет иметь формат с прямым порядком байтов, и вы будете неверно интерпретировать значение вашего целого числа.Следовательно, вы должны преобразовывать целое число в стандартный порядок байтов для платформы, используя функцию типа ntohl(), которую можно найти внутри файла заголовка netinet/in.h

Так, например:

#include <netinet/in.h>

int id;
int sd_client;

//... code to open socket, etc.

//add your own error-checking ... stripped out here for simplicity's sake
read(sd_client, &id, sizeof(int));
id = ntohl(id);

char buffer[32];
snprintf(buffer, sizeof(buffer), "%d", id);
messaggio2(sd_client, logi, buffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...