Ошибка 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), поэтому я был бы благодарен, если бы некоторые эксперты могли дать мне некоторые подсказки или даже предположения.