Я пытаюсь отправить структуру через сокет (я понимаю, что это непереносимое решение, однако, клиент и сервер только для Windows — если есть достаточно легкая реализация более портативного решения, я готов к Это).
Эта система отправляет структуру типа double в другой сокет, а сервер является только перенаправителем. Теперь первая пара структур проходит правильно, но в какой-то момент я начинаю получать данные об мусоре и не могу понять, почему.
Вот код для клиента:
struct aircraft_data {
double altitude;
double indicated_airspeed;
double radio_altitude;
double ground_altitude;
double vertical_speed;
double bank_angle;
double pitch;
double stall_aoa;
double aoa;
double on_ground;
double sideslip;
double heading_mag;
double heading_true;
double track_mag;
double track_true;
double eng_1_epr;
double eng_2_epr;
double eng_1_n1;
double eng_2_n1;
double eng_1_n2;
double eng_2_n2;
double thr_1_pos;
double thr_2_pos;
double yoke_x_pos;
double yoke_y_pos;
double rudder_pedal_pos;
double rudder_pos;
double elevator_pos;
double aileron_pos;
double latitude;
double longitude;
double velocity_body_x;
double velocity_body_y;
double velocity_body_z;
double rotation_velocity_body_x;
double rotation_velocity_body_y;
double rotation_velocity_body_z;
};
Получение конца:
while (kill_dataproc == FALSE) {
if(master == FALSE) {
char* buffer = new char[4096];
int recvd = recv(data_sock, buffer, 4096, NULL);
if (recvd == 4096) {
int sz = sizeof(aircraft_data);
int intsz = sizeof(int);
int newpacketsigner = 0;
memcpy_s(&newpacketsigner, intsz, buffer, intsz);
if (newpacketsigner == 1192) {
memcpy_s(cdata, sz, (void*)(buffer + intsz), sz); //cdata is another struct of the same type - this part works, it usually doesn't get here.
}
}
delete buffer;
}
Sleep(50);
}
Конец отправки (вызывается как часть функции обратного вызова):
char* buff = new char[4096];
int packet_signer = 1192;
int sz = sizeof(aircraft_data);
int intsz = sizeof(int);
memcpy_s(buff, intsz, &packet_signer, intsz);
memcpy_s((void*)(buff + intsz), sz, data, sz);
send(data_sock, (char*)buff, 4096, NULL);
delete buff;
Сервер (выполненный в цикле — метод работает, как я сделал это с другими бинарными серверами (т.е. VoIP):
char* fbuffer = new char[4096];
int recvdf = recv(gp->users[i].sockfd_data, fbuffer, 4096, NULL);
if (recvdf > 0)
gp->send_to_all(fbuffer, i, 1, recvdf);
delete fbuffer;
Я считаю уместным добавить, что если я попытаюсь установить TCP_NODELAY на любом из сокетов, это вызовет ту же проблему, и сокращение времени Sleep () в отправляющем потоке, кажется, также вызывает это.
Задача ещё не решена.
Других решений пока нет …