Winsock статия за всички (част 4)

Както обещах в предишната статия, днес ще разгледаме как приложението на Winsock може да приема входящи връзки. Архитектурата "клиент-сървър" вече е на устните на всички, затова, за да сме в крак с модата, ще организираме прост сървър, който приема входящи връзки.

Ще напишем клиентски приложения, които имат достъп до нашия сървър в следващото издание. Най-нетърпеливите могат да го направят сами.

Нека направим малко теоретично отклонение.

Какво трябва да направим, за да може нашето сървърно приложение да работи в режим на получаване на входящи връзки? Ето списък на това, което трябва да направим:

Както можете да видите, списъкът с необходимите действия не е сложен. С някои точки обаче ще имаме проблеми поради непознаване на материала. Например точки 2-4. В тази статия ще поправим ситуацията!

Нека да разгледаме практическото изпълнение на всеки елемент с помощта на Winsock. Така:

Помислете за функцията за свързване.

A, ако няма грешка, функцията връща нула, в противен случай - SOCKET_ERROR.

По този начин, използвайки функциите getsockname, inet_ntoa, ntohs можем да разберем всички данни, от които се нуждаем по отношение на свързването на сокета.

За да може сокетът да продължи да приема входящи връзки, трябва да използваме функция, която поставя сокета в „режим на слушане“.

SOMAXCONN максимално възможен брой връзки за дадена система.

Ако функцията успее, тя връща null, в противен случай SOCKET_ERROR.

След като сокетът е поставен в състояние на слушане, той може да приема входящи връзки. Функцията за приемане се използва за приемане на входящи връзки.

Ако функцията успее, тя връща нов сокет за установената връзка, в противен случай INVALID_SOCKET.

Сега можем да започнем да пишем основно сървърно приложение. Нека отново опишем протокола на клиентската и сървърната части.

Както можете да видите от диаграмата, сървърът приема връзки, докато не бъде достигнат лимитът, зададен в повикването за слушане, или затворите сървърното приложение. Когато се отвори нова връзка, сървърът получава съобщение от клиента, показва го на екрана и затваря връзката.

Клиент:
1) Създайте гнездо
2) Свързваме се със сървъра
3) Изпратете съобщение
4) Затворете връзката със сървъра
5) Довършителни работи.

Разбира се, тази програма може да се нарече голямата дума „сървър“ на едно място. Тя дори не отговаря на искането на клиента. Мисля, че можете сами да поправите този досаден пропуск.!

Можете също така да експериментирате сами с проблема с блокирането на сокет във функцията за приемане. Предлагам ви да го разрешите с функцията за избор (която разгледахме в предишната статия) сами.

Ако имате някакви проблеми, пишете на форумите, ние ще ги обсъдим заедно!

Не бъдете мързеливи да експериментирате сами!