Доброго времени суток! Возникла проблема при работе с сокетами. СИ изучаю не так давно и то больше по примерам и постам на форумах.
Каждую секунду осуществляется отправка датаграммы? которая по умолчанию имеет некоторые параметры. Внутри цикла происходит приём и разбор датаграммы и изменение битов датаграммы через время, которая отправляется, Проблема в следующем - отправка sent() происходит только после "printf("*** Конец операции ***\n");", хотя стоит до и после таймера, Блокировка в ожидании с recvfrom убрана, В чём может быть проблема?
| Код | msg[2] |= 1; // Управление msg[3] = 0; buf[6]=0;
void sent() { sendto(s2, buf1, sizeof(buf1), 0, (struct sockaddr *)&si_other, slen2); sleep(1); // раз в секунду }
while(1) // Прием датаграммы { buf1[0] = 1; // ВМ1 buf1[1] = 0; // ПУ buf1[2] = 0xDE; // номер 222 buf1[3] = 6; // сумма байт buf1[4] = msg[0] = 0x55; // код начала посылки buf1[5] = msg[1] = 0xAA; // инвертированный код buf1[6] = msg[2]; // состояние апппаратуры 3 байт buf1[7] = msg[3]; // состояние апппаратуры 4 байт buf1[8] = msg[4] = 0; // резерв buf1[9] = msg[5] = (msg[0]%2+msg[1]%2+msg[2]%2+msg[3]%2+msg[4]%2); // контрольная сумма
recvfrom(s1, buf, sizeof(buf), 0, (struct sockaddr *)&si_me, &slen1);
if((buf[6] == 0)) sent();
if ((buf[6] &0x1)==1) {
printf("*** Рабочее положение ***\n"); printf("Запуск насосной станции.\n"); msg[2] = 0; // обнуление 3 байта msg[3] = 0; // обнуление 4 байта msg[2] |= 1; // Управление msg[2] |= 2; / sent(); sleep(5); printf("Давление в норме!\n"); msg[3] |= 8; // Давление норма sent(); printf("*** Конец операции ***\n"); buf[6] = 0; } }
|
Спасибо за помощь! |