Программирование сокетов и массивы

Привет, я пытаюсь создать 2 программы, которые общаются через сокеты TCP на C++. Я знаю, как использовать функции write() и read(), но сталкиваюсь с проблемой, когда пытаюсь отправить массив из одной программы в другую. Чтобы быть более конкретным, я пытаюсь отправить массив символов с одной стороны и прочитать его с другой, но это не работает.

Массив, который я пытаюсь отправить, определяется следующим образом:

char** list=new char[5];
for(int i=0;i<5;i++){
char[i]=new char[25]
}

char[0]="Hello";
char[1]="world";
char[2]="this";
char[3]="is";
char[4]="a test";

и я пишу это в сокет таким образом:

 void sendtosocket(.. , char array[]) { 
    int size=5*sizeof(char[25]);
    write(sock, &size, sizeof(int))
        write(sock,&array,size); 
}

а с другой стороны я пытаюсь прочитать это так:

void readfromsocket(..){

read(sock, &size, sizeof(int));  
char test[5][25];
cout<<size<<" bytes must be read"<<endl;

 read(newsock,&test,size);              

for(int i=0;i<5;i++)
 cout<<test[i]<<endl;

}

вывод, который я получаю,

Я должен прочитать 125 байт

Привет

s

тест

Вы можете помочь мне? заранее спасибо! Учтите, что соединения и сокеты работают нормально!


person JmRag    schedule 24.05.2013    source источник
comment
Для C++ рассмотрите возможность использования Boost::asio (boost.org /doc/libs/1_53_0/doc/html/boost_asio.html) или OnPosix (onposix.sourceforge.net) библиотеки.   -  person Claudio    schedule 24.05.2013


Ответы (2)


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

В первую очередь в:

char** list=new char[5];
for(int i=0;i<5;i++){
char[i]=new char[25]
}

char[0]="Hello";
char[1]="world";
char[2]="this";
char[3]="is";
char[4]="a test";

Вы не заполняете свой массив или, по крайней мере, зря выделяете память. Вы указываете указатели вашего массива на место, где находятся константные символы "Hello", "wold" и теряете память, выделенную в "char[i]=new char[25]" . Будьте осторожны с операциями с памятью.

Принимая это во внимание, вы не знаете содержимого значений после «Hello\0», и вы пытаетесь отправить 125 непрерывных байтов...

В другом порядке, в:

 void sendtosocket(.. , char array[]) { 
    int size=5*sizeof(char[25]);
    write(sock, &size, sizeof(int))
        write(sock,&array,size); 
}

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

person Jon Ander Ortiz Durántez    schedule 24.05.2013
comment
Да, мое предположение, полагать, что это было в непрерывной памяти, было очень ошибочным, я исправил это. - person JmRag; 28.05.2013

Это явно неправильно:

char** list=new char[5];
for(int i=0;i<5;i++){
    char[i]=new char[25]
}

char[0]="Hello";
char[1]="world";
char[2]="this";
char[3]="is";
char[4]="a test";

Вероятно, вы имели в виду:

#include<iostream>
#include<cstring>

char* list[5];
for(int i = 0; i < 5; ++i){
    list[i]=new char[25];
}

std::strcpy(list[0], "Hello");
std::strcpy(list[1], "world");
std::strcpy(list[2], "this");
std::strcpy(list[3], "is");
std::strcpy(list[4], "a test");
person Claudio    schedule 24.05.2013