книги по сетевому программированию

xoki87

я в этом нифига не смыслю, с чего лучше начинать изучение написание сетевых приложений? язык c++

okis

Стивенс. Это, правда, для C, зато системные вызовы.

elenangel

я бы посоветовал вначале разобраться с многопоточным программированием, если эта тема конечно не знакома, и только потом переходить к сетям.

zya369

с чего бы вдруг?

elenangel

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

zya369

с чего бы это?

elenangel

С того, что новичок первым делом нагуглит пример с блокирующими (которые по дефолту получаются и в винде и в *nix) сокетами и блокирующими вызовами recv/accept. С select разбираться чуть сложнее, это следующий шаг после простейшего приложения. И будет человек переводить сокеты в неблокирующий режим и изобретать велосипед с педалями в виде цикла опроса сокетов из одного треда и кусочного выполнения задач обработки данных, вместо того чтобы воспользоваться многозадачностью. Это конечно не плохо, но начинать с этого, имхо, не надо.

zya369

ну как бы простейший сервер может просто посылать данные ничего не читая - в этом случае не понабиится почти наверняка ни select-ов ни неблокирующих write-ов
а начинать писать tcp сервер без select-а это не тру

elenangel

а как же неблокирующий accept? или простейший tcp-сервер может обслуживать не больше 1 клиента?

zya369

ты не понял
речь была про следующее
 
 
while(true) {
fd = accept;
write(fd, "hello world!\n");
close(fd);
}

для простейшего сервера, работающего на loopback-е этого более чем достаточно
если же у тебя соединения будут приходить быстрее, чем ты можешь в них послать 13 байт, то многопоточность тебя не сильно спасет )

elenangel

ок, и что дальше делать с таким сервером?

zya369

а "дальше" уже в любом случае речь пойдет о select-e и треды не то чтобы очень нужны

kokoc88

если же у тебя соединения будут приходить быстрее, чем ты можешь в них послать 13 байт, то многопоточность тебя не сильно спасет )
Она как раз тебя и спасёт.

elenangel

все равно, писать сетевые приложения в один поток и не пользоваться наличием возможности параллельно выполнять разные задачи - это костылизм, может еще и компилятором не пользоваться, ведь можно в хекс коды фигачить, на крайняк на асме.
ну это если конечно речь не идет о написании для 10-100к подключений, там конечно идея "одно подключение" - "один (2, 3 ...) поток" терпит былинный отказ.

Marinavo_0507

для того, чтобы сделать один поток на соединение, не нужно именно _разбираться_ в многопоточном программировании - надо взять шаблон и вставить туда свой "hello, world"
а если задача сложнее, то там уже более интересные вещи начнутся, в которых нужно разбираться: типа что будет, если несколько потоков одновременно делают операции с сокетом - и это очень системно-зависимо

Marinavo_0507

а что никто не предлагает фреймворк взять какой-то?
самое банальное - веб-сервер
ну и для клиента какую-нибудь библиотеку

elenangel

согласен с первой частью, но по-крайней мере запустить поток и понимать что 2 потока работают параллельно нужно уметь.

erotic

или простейший tcp-сервер может обслуживать не больше 1 клиента?
А зачем ему? Форкнулся, обслужил, умер.

erotic

Она как раз тебя и спасёт.
А чем поможет многопоточность, если приходит очень много коннектов? accept все равно однопоточный будет, а отдавать другому потоку сделать send и close - больше пользы, чем вреда?
Хотя... accept же можно параллельно из нескольких потоков вызвать? Вроде не запрещено. Но я такого пока не видел. Хотя кажется, что и от такого немного пользы.

elenangel

много коннектов которые однажды установлены и живут долгое время и много коннектов, которые живут доли секунды и случаются много раз в секунду это разные вещи. в первом случае accept из одного треда вполне ок, а обслуживание - пулом тредов. во втором случае кажется таки можно и accept внесколько потоков раскидывать.
еще можно в одном треде читать сокет, а в другом - писать в него.

elenangel

лучше же вначале понять как оно на низком уровне работает, а во фреймворке это хорошо спрятано за абстракциями и в результате разобравшись с одним фреймворком можно так и не понять как же это работает на самом деле.

elenangel

А зачем ему? Форкнулся, обслужил, умер.
форк - это тоже многопоточность, вернее многопроцессность. и годится только пока коннекшны не взаимодейтвуют друг с другом. попробуй например сервер для чятика написать на форкающемся сервере, сообщения будешь через пайпы гонять или через юникс сокеты или через хитровыебанную шареную память опять же с мьютексом, вместо того чтобы в обычной памяти через мьютекс разделять.

kokoc88

Хотя... accept же можно параллельно из нескольких потоков вызвать? Вроде не запрещено. Но я такого пока не видел. Хотя кажется, что и от такого немного пользы.
Можно. И ещё можно это делать асинхронно.
Ситуацию, когда один поток не справляется с accept и выкидыванием задачи в тред пул, очень просто воспроизвести. Это не такая уж большая нагрузка на самом деле, особенно если программируешь не на C.

erotic

попробуй например сервер для чятика написать на форкающемся сервере
Ты же сначала про простейший tcp-сервер писал там, где я откомментил. А теперь начинаешь усложнять примеры.

elenangel

ок, согласен, для простейшего сервера форка достаточно, но это не отменяет того, что такой сервер не является однопоточным, т.е. даже для простейшего сервера нужно больше одного потока, хоть fork, хоть pthread_create
Оставить комментарий
Имя или ник:
Комментарий: