Ошибка revc сокета Java: EINTR

Я работаю на машине с Linux и использую сокет Java для связи между виртуальной средой и моделью SystemC.

При использовании функции recv для получения данных у меня было сообщение об ошибке 4: EINTR

Я пытался увеличить время ожидания, но ошибка все еще существует. Есть ли другая возможная причина этой ошибки прерывания сигнала?


Клиентский сокет соединен с платформой Jmonkey для получения видеокадра

Сокет клиента следующий:

создать и подключить сокет к

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (connect(sock,(const sockaddr*)address,sizeof(ADDR)) < 0){
        close(sock);
        SOCKERR("failed to connect socket ("<<errno<<")")
        return false;
    }
    int result = setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *) &flag, sizeof(int));

когда модели systemC требуется видеокадр, она отправляет запрос и использует recv для получения данных:

floatStringStream << "x=" << x;
floatStringStream << " y=" << y;
floatStringStream << " th=" << th;
........

char * buf = (char*) malloc((strlength+1)*sizeof(char));
strcpy(buf,str.c_str());

// send string to java
if (!sndPacket((char) 3,buf,strlength)){    
    SOCKERR("failed to send render request")
    return 0;
}

// cleanup
free(buf);

// receive answer
int len = rcvPacket();

В sndPacket() мы используем send() для передачи всех параметров на сервер и, наконец, в rcvPacket() мы используем recv для получения видеокадра. Период для этого запроса составляет 1 мс в модели SystemC, но неопределен в реальном времени в зависимости от скорости моделирования (обычно несколько секунд).

В моей системе первые несколько кадров могут быть успешно переданы, но когда он отправляет 5-й или 6-й запрос, приходит EINTR. Есть ли возможная причина прерываний? Например, некоторые другие программы или функции в клиенте? Я не знаю, что находится на стороне сервера (платформа Jmonkey), поэтому я был бы благодарен, если бы некоторые эксперты могли дать мне некоторые подсказки или даже предположения.

0 ответов

Другие вопросы по тегам