LINUX.ORG.RU

Сообщения shotakoe

 

accept() ведёт себя по-разному в С и С++? Errno=17 File exists.

Форум — Development

UPD: видимо, я сообщил мало информации, чтобы местные умники смогли вычислить проблему. Решил оставить сервер на C++ и не переделывать. Всем спасибо!

Здравствуйте. Переписываю программу с С++ на С. Всё скомпилировалось, но проблема выскочила там, где я не ожидал. Логика приложения не изменилась, accept() на блокирующем слушающем сокете, одинаковая инициализация; в С++ работает без вопросов, а в С возвращает -1 и устанавливает errno = 17 (File exists), то есть не то чтобы проскакивал с WOULDBLOCK, а именно ошибка выполнения функции. Дебаггер показывает, что iWaitingSocketDescriptor подаётся на вход верный.

Разница в коде вот такая:

void *MyClass::Accept_Thread ( void *vptr_args ) {
	int iNewConnection;
	do {
		iNewConnection = accept ( iWaitingSocketDescriptor, NULL, NULL );
}

static void *Accept_Thread ( void *vptr_args ) {
	int iNewConnection;
	do {
		iNewConnection = accept ( iWaitingSocketDescriptor, NULL, NULL );
}

В первом случае iWaitingSocketDescriptor - статический член класса, во втором - глобальная переменная, в обоих случаях дебаггер показывает, что значение корректное.

Как я уже писал, инициализация в обоих случаях одна и та же:

  stWaitingSocket.sin_family = AF_INET;
  stWaitingSocket.sin_port = htons ( 1025 );
  stWaitingSocket.sin_addr.s_addr = htonl ( INADDR_ANY );
  iWaitingSocketDescriptor = socket ( AF_INET, SOCK_STREAM, 0 );
  iResult = bind ( iWaitingSocketDescriptor, ( struct sockaddr * ) &stWaitingSocket, sizeof ( stWaitingSocket ) );
  iResult = listen ( iWaitingSocketDescriptor, 1 );
... и проходит без ошибок.

Где-то ошибка, но, видимо, глаз замылился или, что скорее, из-за неопытности не знаю или просто не понимаю, что делаю не так. Подскажите пожалуйста?

 

shotakoe
()

Что будет со статической функцией-потоком, если удалить экземпляр класса?

Форум — Development

Здравствуйте.

Подскажите, пожалуйста, ответ на такой вопрос. Я написал класс С++, в котором в качестве метода присутствует статическая функция, которая идёт в качестве параметра в pthread_create. В конструкторе единственного экземпляра класса я создаю этот поток, работаю там с данными-членами класса и глобальными переменными, используя мьютексы для совместно используемых данных, всё работает неплохо, но вот какое дело.

1. Что будет с самим потоком и текущей «точкой исполнения», если во время выполнения этой статической функции-потока произойдёт удаление экземпляра класса из другого потока?

2. Если вся эта конструкция не предусматривает нормального останова и клинапа, но само приложение вообще предназначено для того, чтобы работать на серверной стороне пока работает само железо и падать будет только вместе с ним (выключение или перезапуск приложения не потребуются), то можно ли оставить так или «по хорошему» всегда требуются механизмы перезапуска?

Посоветуйте, пожалуйста, заранее благодарен за конструктив.

 

shotakoe
()

RSS подписка на новые темы