read /write

Модератор: Модераторы разделов

inlines
Сообщения: 10
ОС: kubuntu 7.10

read /write

Сообщение inlines »

очень надеюсь на вашу помощь итак 2 програмы -отправитель и получатесь соединяются при помощи сокетов
отправитель делает следующее

Код: Выделить всё

   memset(buffto, 0, sizeof(buffto));//очищаем буфер
    n = read ( 0, buffto, sizeof(buffto) );//как я понимаю теперь в буфере теперь содержится само сообщение потом '\n' потом '\'
    //cout<<n<<endl; // количество считаных символов получаем на 2 больше чем введенных те как я думаю с бслешн и бслеш0
    a.Send( buffto);//отправляем функцией сенд
сама функция Send:

int Send ( char* message)
    {
    int len;
    len = write( sd, message, strlen(message)+1);
    cout<<"VOT"<<len<<endl;
    printf("message sent:");
    printf( "%s\n", message );
    return len;
    }


теперь програма приниматель:
тут только выполняется функция

    int Recv ( char message[256],int d )
    {
    int len;
    len = read ( d, message, strlen(message)+1);
    cout<<"VOT"<<len<<endl;     //вроде должна печатать то же число что и выводится в отправителе
    return len;
    }
однако получается вообще нечто странное- печатается 2 числа которые в сумме представляют какраз количество отправленных символов!!

тоесть отправив слово 12345 отправитель выведет число 7 а получатель выведет вот что дословно:
VOT2
VOT2
VOT2
VOT1


много эксперементировал с sizeof strlen но успеха не добился
очень прошу обьясните дураку что не так я просто не понимаю где же я наляпал
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: read /write

Сообщение v04bvs »

В функции Recv написан бред.

Совет: отправляйте длину строки перед ней самой.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: read /write

Сообщение nesk »

inlines писал(а):
18.03.2008 23:17
int Recv ( char message[256],int d )
{
int len;
len = read ( d, message, strlen(message)+1);


а что у нас в переменной message? Очевидно ничего - мусор.
А как strlen читает длину строки? Ищет конец строки -
А где в message ? - Как повезет, но наверно где то в начале.


сделайте вывод возврата strlen(message)+1 в Recv до чтения и посмотрите что будет.
Может стоит использовать pipe или очередь сообщений
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: read /write

Сообщение dronord »

Наверное, сокеты TCP, раз у тебя такие проблемы.
Чтобы получить удовольствие от этого протокола, тебе нужно придумать свой программный протокол передачи данных.
Что будет началом порции данных, что длиной данных, что данными.
Твой код лучше выглядит вот так:

Код: Выделить всё

int Send(char *message, int mLen)
{
    int len;
    len = write(sd, message, mLen);
    cout << "VOT" << len << endl << "message sent:" << endl << message << endl;
    return len;
}

int Recv(char *message, int mLen, int d) // message[256] - передаешь по значению вешь массив, а это накладно
{
    int len;
    len = read(d, message, mLen);
    cout << "VOT" << len << endl;     //вроде должна печатать то же число что и выводится в отправителе
    return len;
}
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: read /write

Сообщение nesk »

а можно еще читать в цикле по одному байту до тех пор, пока не встретиться конец строки :)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: read /write

Сообщение dronord »

nesk писал(а):
20.03.2008 16:04
а можно еще читать в цикле по одному байту до тех пор, пока не встретиться конец строки :)

inlines, это шутка.
Если только ты кроме строк ничего не передаешь и всегда передаешь ноль.
Спасибо сказали: