LINUX.ORG.RU

Стал разбираться, но что-то не так, как в манах написано


0

0

Стал разбираться с сокетами!
Написал прогу, но она напрочь не слышит
что кто-то хочет подключится к порту (всегда в цикле) :(
Хотя, судя по манам - должна работать!
Значения переменной port - перебирал все!

Посмотрите плиз, что именно не так тут?
Огромное спасибо всем, кто ответит!

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

struct sockaddr_in adress;

main () {

	int sock_tcp, result, port=200;
	
	memset (&adress, 0, sizeof(adress));
	
	adress.sin_len = sizeof(adress);
	adress.sin_family = AF_INET;
	adress.sin_port = port;

	sock_tcp = socket(PF_INET, SOCK_STREAM, 0);
	bind(sock_tcp, (struct sockaddr *)&adress, sizeof(adress));
	result = -1;

// Цикл, из которого не выходит НИКОГДА!!!
	while (result<0) {
                // ДАЖЕ при отсутствии конекта почему-то возвращает 0!
		result = listen (sock_tcp, 4);
	}

shutdown (sock_tcp, 2);
	printf ("\n%i\n", result);
}

Отзовитесь плиз кто-нибудь!
anonymous

hton(port)

И в listen, по-моему, всегда больше 5 коннектов, что бы ты ни написал, хотя это и не важно.

s0mbre ()

Re: Стал разбираться, но что-то не так, как в манах написано

Вместо listen надо использовать accept.

justme ()

Re: Re: Стал разбираться, но что-то не так, как в манах написано

listen все равно нужен, но он, судя по всему, работает неверно даже первый раз. Потом justme сказал верно, что нужен accept

s0mbre ()

Re: Стал разбираться, но что-то не так, как в манах написано

Плохо ты маны читал! Порядок такой:

serv_sock = socket(...);
bind(...);
listen(...);

while(...)
{
req_sock = accept(serv_sock, ...);

// тут, например, создаем thread, который работает с req_sock
// или сами его обрабатываем, но тогда запросы параллельно
// обрабатываться не будут
}
close(...);

рекомендую: http://www.ntua.gr/sock-faq/

anonymous ()

Re: Стал разбираться, но что-то не так, как в манах написано

всем спасибо, удаляюсь читать =) Если кто-то еще ответит, буду очень благодарен =)

anonymous ()

Threads must die

man 2 poll
threads/forks ne effectivni esli ti ispolzuesh odin processor

mithraen ()

Re: Стал разбираться, но что-то не так, как в манах написано

Кстати, в переменной adress.sin_port порядок байтов поменять надо.
смотри ф-ию htonl.
Т.е. порядок должен быть такой-же, как в BIG ENDIAN архитектуре.

Havoc ★★★★ ()

Re: Стал разбираться, но что-то не так, как в манах написано

2 mithraen: чушь ты говоришь Даже на одном процессоре можно эффективно обрабатывать одновременно несколько запросов, т.к. как правило серверный процесс большую часть времени не занимает процессор, а простаивает в ожидании завершения ввода/вывода с диска, всяких сетевых операций и других медленных вещей. А кроме того, представьте себе, например, телнет-сервер, на который приконнектился юзверь и нажимает по кнопке в час - почему бы таких одновременно 100 не держать. Так что threads/fork рулят!!! Хотя есть люди, которые параллелизм запросов реализуют с помощью select'а. Но это, на мой взгляд, изврат - по сути из той же оперы, что фиберы в виндах

anonymous ()

Re: Стал разбираться, но что-то не так, как в манах написано

Ежели много юзеров с медленным обменом то лучше select ну а наоборот то тогда лучше нити

kirill_s ()

Re: Стал разбираться, но что-то не так, как в манах написано

Спасибо всм большое =)
Даже не ожидал солько полезных советов!

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