LINUX.ORG.RU

connect() завершает процесс в случае неудачи

 , , ,


0

2

Такой вопрос:

if( connect(*psockfd, (struct sockaddr*)&ESMBSaddr, sizeof(ESMBSaddr)) < 0) {
        printf("\nСоединения не случилось\n") ;
	close(*psockfd) ;
	return E_CONNECT_ERROR ;
}
если программа попадает в тело условия, то сообщение выводится и процесс почему-то завершается. Видимо откуда-то приходит сигнал или типа того. А мне нужно дальше пробовать соединиться. Помогите, пожалуйста.



Последнее исправление: CYB3R (всего исправлений: 1)

Видимо откуда-то приходит сигнал или типа того

man gdb пробовал?

sergej ★★★★★
()
Ответ на: комментарий от anonymous

не. return в main значение возвращает, у меня соединение настраивается в отдельной функции

podovalov5
() автор топика

иди читай маны на errno

anonymous
()
Ответ на: комментарий от di

Connect не соединяется потому что я сам интерфейс сетевой роняю. Проверяю граничные условия

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

Ну так телепаты еще в школе, ты либо рабочий сорец и логи с консоли вываливай, либо не морочь народу голову. Не работает, падает, не помогло — диагностика уровня днища.

anonymous
()
Ответ на: комментарий от podovalov5

Если вдруг (ну вдруг) решишься на gdb, то br src.c:15 - поставить брейк, run, next, step, print, continue. Что-то можно сокращать n/s/etc.

anonymous
()
Ответ на: комментарий от anonymous

Замечания вполне по делу. Вот код.

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <typedefs.h>

int init_connect( int* );	// функция инициализации соединения
int sockfd = 0 ;

int main( int argc, char * argv[] )
{
        while(1)
        {
                sleep(10) ;
		if( init_connect( &sockfd ) )
			break ;
        }
}

int init_connect( int* psockfd )
{
	struct sockaddr_in ESMBSaddr ;
		if( (*psockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		print_log("\nНе удалось создать сокет: %d\n", *psockfd) ;
		return E_SOCKET_ERROR ;
	}

	bzero(&ESMBSaddr, sizeof(ESMBSaddr)) ;
	ESMBSaddr.sin_family = AF_INET ;
	ESMBSaddr.sin_port = htons(globalArgs.esmbsPort) ;
	if( inet_pton(AF_INET, globalArgs.esmbsAddress.c_str(), &ESMBSaddr.sin_addr) <= 0)
	{
		print_log("\ninet_pton не справилась с %s", globalArgs.esmbsAddress.c_str()) ;
		close(*psockfd) ;
		return E_HOSTNAME_ERROR ;
	}
	if( connect(*psockfd, (struct sockaddr*)&ESMBSaddr, sizeof(ESMBSaddr)) < 0)
	{
		print_log("\nСоединения не случилось\n") ;
		close(*psockfd) ;
		return E_CONNECT_ERROR ;
	}
	return E_OK ;
}

podovalov5
() автор топика
Ответ на: комментарий от kawaii_neko

врядли на той системе для которой я программирую есть эта утилита. Но посмотрю конечно.

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

Да не должен он завершать!

if( init_connect( &sockfd ) )

то же что и if( init_connect( &sockfd ) != 0 )
т.е. и меньше и больше нуля, ну и ессно, break;

deep-purple ★★★★★
()
Ответ на: комментарий от podovalov5

Смотри-ка, я даже номер строки угадал!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.