сеть и сообщения - PullRequest
       17

сеть и сообщения

0 голосов
/ 27 ноября 2011

хорошо, поэтому я пытаюсь быть более эффективным в своем программировании, пытаясь передать несколько строк в виде одного массива [100].Я могу передать всю эту информацию от моего клиента совершенно нормально, но теперь я пытаюсь использовать substr или strch, чтобы удалить значения, которые я передал, используя массив char на стороне сервера.

сервер будет выглядеть так с другойконец, с данными, переданными от клиента, сохраненными в памяти под vel_rec:

recv(sock, vel_rec, 100, 0);

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

client:

char vel_snd[100], vel_rec[100], char buffer[100]; 
memset(buffer, 0, 99); 
memset(vel_snd, 0, 99); 
memset(vel_rec, 0, 99); 
recv(sock, buffer, 100, 0);
//are we connected? 
cout << "connection status = " << buffer << endl; 
string v0, a, time, space = "\n", stop;  stop = 'g';
while (stop != "x")
{
    cout<<":::Press 'x' then 'enter' at any time to quit:::"<< endl;
    cout<<"enter data? "<< endl;
    cin>>v0;
    stop = v0;
    cout<<"some more data? "<<endl;
    cin>>a;
    stop = a;
    cout<<"even more data? "<<endl;
    cin>>time;
    stop = time;
    v0 += space + a + space + time;
    strcpy(vel_snd, v0.c_str());        
    send(sock,vel_snd,strlen(vel_snd), 0);
    cout<<"Calculating...\n";
    recv(sock, vel_rec, 100, 0);
    cout<<"\nThe data in "<<time<<" seconds will be "<<vel_rec<<endl;
}

хорошо, так что все нормально, я уверен, что существуют бесконечно лучшие решения для конкатенации нулевых символовчто я даже не уверен, что сработает, просто оставил их там, чтобы вы могли выбрать, если вы можете использовать их на стороне сервера вещей.Я пытался использовать их, чтобы разорвать мои исходные струны, но безуспешно.Я просто хочу, чтобы сервер получил этот массив символов и скопировал его части в строки.Я предполагаю, что это возможно, но если бы я не мог всегда отправлять несколько массивов символов, мне просто кажется, что они будут перепутаны на сервере, если не будут должным образом помечены и упорядочены по мере поступления данных. Один в один выходитКажется, очень чистым и предпочтительным, если честно.Использование строк здесь может даже не понадобиться, я просто подумал, что это будет лучше, чем использование значений int и преобразование, когда я могу просто передать их как строки для начала.В любом случае, мне все еще нужно реализовать какой-то метод выделения значений, отправленных на сервер от клиента, и substr не хочет работать с массивом char.

Я также невероятно незнаком с сетью.и это моя первая попытка из некоторых уроков, которые я видел.У меня была 30-минутная лекция по этому вопросу, без каких-либо дополнительных объяснений, кроме «это работает».При этом будьте конструктивны в своих ответах.Надеюсь, я смогу узнать немного больше, чем просто это, поскольку я планирую реализовать нечто подобное в сетевой игре, над которой я работаю.о, и прежде чем я забуду, что это использует wsock32.lib.

резюме:

[client] 
char array1[100] = string 1 + string 2 + string 3 
server<--char array1 
char array2<--- server 
print 
[server] 
char array1<---client string 1 + string 2 + string 3 
int A = string 1 
int B = string 2 
int C = string 3 
<some math...> 
<char array 2 = itoa  A B C> 
client <--- char array2

Спасибо большое

Шон

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

Не уверен, что я понял вопрос, но простой метод, например, заключается в том, чтобы каждый раз, когда клиент вводит что-то, он завершается переводом новой строки. Сделайте и когда вы закончите ввод данных, затем отправьте это сообщение. Когда сообщение затем отправляется, вы автоматически отправляете размер массива на сервер. Например, на стороне сервера:

char* temp;
int i=0;
nr=read(sd,buf,sizeof(buf));
temp = strtok(buf,"\n");
//Got the first token within the string.
//I'm pretending its an int to switch case the server
switch(i){
case 1:
temp = strtok(NULL,"\n");
//Get the next token
printf("CASE 1 with: %s",temp);
break;
}

и т.д ...

Я не тестировал этот код и просто написал его из глубины своего сознания, поэтому, если в синтаксисе есть ошибки, я опровергаю.

Удачи

1 голос
/ 27 ноября 2011

предположим, что вы сохранили полученные данные в std::string received, затем вы можете разделить их, используя эту функцию:

std::vector<std::string> string_split(const std::string & str, char delim) 
{
    std::vector<std::string> elems;

    std::stringstream strstream(str);
    std::string item;
    while(std::getline(strstream, item, delim))
        elems.push_back(item);    

    return elems;
}

, затем позвоните

std::vector<std::string> messages = string_split(received, '\n');

РЕДАКТИРОВАТЬ

Кстати, вы можете заменить этот код

char vel_snd[100], vel_rec[100], char buffer[100]; 
memset(buffer, 0, 99); 
memset(vel_snd, 0, 99); 
memset(vel_rec, 0, 99); 

на этот код

char vel_snd[100] = {0}, vel_rec[100] = {0}, char buffer[100] = {0}; 

не совсем то же самое, но достаточно хорошо при работе с массивами символов.

0 голосов
/ 29 ноября 2011

ну, в конце концов я просто сломался и отправил отдельные многопоточные массивы, каждый из которых содержал необходимые значения, выполнил atoi, выполнил вычисления, сохранил вычисленный int результат, используя itoa, и отправил его клиентам.Просто нужно было ударить КИССа по лицу.Попытался создать графический интерфейс для поддержки vs2010, но это была головная боль, поэтому переключился на Qt, так что я вернусь с вопросами по этому поводу, я уверен.Спасибо за все отклики.Я пытался проголосовать, но у меня слишком низкая репутация.

...