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
()
Ответ на: комментарий от justme

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

s0mbre
()

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

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

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

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

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

anonymous
()

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

anonymous
()

Threads must die

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

mithraen
()

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

Havoc ★★★★
()

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

anonymous
()

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

kirill_s
()

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

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