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 );
Где-то ошибка, но, видимо, глаз замылился или, что скорее, из-за неопытности не знаю или просто не понимаю, что делаю не так. Подскажите пожалуйста?