Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2011, 09:27   #1
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию Проблема с socket и pthread

Здравствуйте уважаемы знатоки. Прошу у вас помощи, т.к. сам уже всю голову сломал.
Есть код на FreeBSD 7.2 (c++):

Код:
	int sock;

	if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		fprintf(flog, "[ERROR] socket() failed! errno: %i\n", errno);
		return 0;
	}

	memset(&sin, 0, sizeof(sin));
	sin.sin_port = htons(UCPport);
	sin.sin_addr.s_addr = INADDR_ANY;
	sin.sin_family = AF_INET;
	bzero(&(sin.sin_zero),8);

	if(bind(sock,(struct sockaddr*)&sin, sizeof(struct sockaddr)) < 0)
	{
		LogTime();
		fprintf(flog, "[ERROR] bind() failed! errno: %i\n", errno);
		return 0;
	}

	LogTime();
	fprintf(flog, "[INFO] Waiting for Connections!\n");

	while(1)
	{
		socklen_t sin_size = sizeof(sin);
		if(listen(sock, 5) != -1)
		{			
			int client;
			printf("tut nahodimsa");
			client = accept(sock, (struct sockaddr*)&sin, &sin_size);
			if (client < 0 || !fork())
				fprintf(flog, "[ERROR] Can't accepted client!");
			else
			{
				pthread_create(0, 0, (void*(*)(void*))HandleClient, &client);
			}
			fprintf(flog, "yes2");

		}
		else
		{
			LogTime();
			fprintf(flog, "[ERROR] listen() failed! errno: %i\n", errno);
			return 0;
		}
	}
Проблемы тут 2:
1. при закоментированном pthread_create (т.к. проверяю только сокет пока что), то в файл выводится только [INFO] Waiting for Connections!, но не могу понять почему не выводится tut nahodimsa, но если закоментить accept, то нормально, зацикленно выводится эта надпись. Не могу понять как влияет на нее accept, если вывод происходит раньше? А также, ну допустим нет у меня вывода tut nahodimsa. В винде (виндовый код вырезан, чтобы не создавать бардак) прога спокойно ждет, когда же к ней подцепятся на accept. Как подцепились выводит yes2. На фришке же компилю, при подключении прога просто закрывается.

2. Убираю accept, и оставляю pthread_create:
Код:
void HandleClient(void* socket)
{
	printf("tut");
	return;
}
Компилю с -lpthread. При запуске создается ещё файлик: имя_проги.core и все закрывается и даже tut не выводит

Помогите люди добрые, он даже ошибки не выводит. Вообще ничего. Просто не понятно в какую сторону даже ковырять.

Последний раз редактировалось Tahoma; 04.03.2011 в 09:33.
Tahoma вне форума Ответить с цитированием
Старый 09.03.2011, 10:25   #2
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Ещё блин при fwrite также progname.core создает и вылетает, хотя fopen нормально отрабатывает и создает файл.

Вообще не в понятках, что за фигня такая.

Ещё если выводить текст через printf, то нормально выводит, но если запустить прогу:
./progname > 1.txt
то уже ничего не записывает.

Самое интересное, что если открываемый порт уже занят, т.е. выдается ошибка сокета, то и fwrite робит и:
./progname > 1.txt




Разобрался и с сокетами и с записью файлов.
По записи: freebsd очень придирчиво к файловым потокам, т.е. после записи надо правильно закрыть (fclose). Мелочь вроде бы всем известная, но блин упустил как то.
По сокетам: нашел материлов до кучи, а внимания особого не обратил, т.к. не знал что сокеты могут быть и заблокированными. Т.е. у меня прога тупо зависала на recv, и зависала даже быстрее, чем надпись выводилась на экран. По этому надпись tut nahodimsa не появлялась (см. 1 пост).

p.s.: думаю может кому пригодятся в жизни решение таких проблем, по этому и отписался.
p.s.s: с pthread пока разбираюсь

Последний раз редактировалось Tahoma; 09.03.2011 в 12:28.
Tahoma вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Socket.SendText проблема SwiP Работа с сетью в Delphi 11 19.03.2012 13:36
Приложения с pthread Stenly Общие вопросы C/C++ 4 18.11.2010 20:27
Socket Djem1991 Работа с сетью в Delphi 6 03.07.2009 23:45
socket Артэс C/C++ Сетевое программирование 2 22.06.2009 17:22
Socket Get Editor Работа с сетью в Delphi 7 22.04.2008 05:48