Урок 34
Visual C++. MFC Урок 34. Писане на сървър с помощта на CSocketВ този урок ще напишем сървърната страна на нашето приложение. Стартирайте MFC AppWizard и го използвайте, за да създадете диалогово приложение. За името на проекта въведете сървър. На стъпка 2 не забравяйте да поставите отметка в квадратчето за поддръжка на Windows Sockets: На същата стъпка можете да премахнете отметката от полето About и ActiveX support. След като създадете заготовка за нашата програма, поставете върху формуляра един бутон (с идентификатор IDC_LISTEN и заглавие Listen) и една редакция (с идентификатор IDC_DATA). Когато щракнете върху бутона Слушане, сървърът ще започне да слуша мрежата. След като клиентът се свърже с нашия сървър и изпрати някои данни, те ще се появят в нашата редакция. За простота, веднъж свързан, само клиентът ще може да изпраща данни. Ако искате да изпращате данни и от сървъра, тогава ще трябва да добавите код към сървърната страна на нашата програма, подобно на кода от клиентската страна (което ще разгледаме в следващия урок). След като поставим всички елементи, нашата програма ще изглежда така: Към нашия edit'u (с идентификатор IDC_DATA) атрибут с помощта на ClassWizard променлива m_sData от тип CString. Нека да се заемем с писането на кода. Създайте нов клас CMySocket като наследник на класа CSocket: Добавете към него променлива от тип указател към CServerDlg: Тази променлива ще съхранява указател към нашия диалогов прозорец. Тъй като тук използваме класа CServerDlg, трябва да добавим реда След това трябва да добавим метод за задаване на променливата m_pDlg. назови гоSetParentDlg. Реализацията за него е най-простата Сега трябва да напишем 2 виртуални функции в нашия клас - OnAccept и OnReceive. Първият ще бъде извикан, когато нашият сокет, който слуша в мрежата, получи заявка за връзка от страна на клиента. Вторият - при получаване на данни от клиента. За да добавите виртуална функция OnAccept, щракнете с десния бутон върху раздела ClassView на класа CMySocket и изберете Добавяне на виртуална функция. В прозореца New Virtual Override for Class CMySocket, който се показва, щракнете двукратно върху функциите OnAccept и OnReceive в десния списък и щракнете върху OK. Добавете следния код към създадените функционални заготовки: В тези два фрагмента, след показване на MessageBox (за яснота на процеса), ние извикваме функциите със същото име в нашия диалогов прозорец (чрез променливата m_pDlg, която ще съхранява указателя към главния прозорец). Все още не сме написали тези функции на диалоговия прозорец. Защо е по-добре да поставите кода за обработка в класа на диалоговия прозорец, а не в класа на гнездото? Тъй като данните по принцип се изпращат в диалоговия прозорец, а не в нашия сокет. Тук нека диалоговият прозорец също разбере. Но по принцип цялата обработка може да се извърши в класа на сокета. Тъй като използваме променливата m_pDlg в този фрагмент, ние пишем реда, преди да внедрим методите Сега нека да разгледаме класа на диалоговия прозорец. Първо задайте две променливи от типа CMySocket в него: Обърнете внимание на добавеното включване - без него компилаторът ще ругае линии с два добавени сокета. Както можете да видите, имаме два гнезда. Първият (m_pListenSocket) е слушащият сокет. Когато сървърната част на нашето приложение започне да работи, той е този, който слуша на определен порт, за да види дали някой клиент иска да се свърже. Възможно най-скоросе получава заявка за връзка от клиента, тогава нашият слушащ сокет m_pListenSocket ще прехвърли връзката към предаващия m_pConnectSocket сокет и той ще продължи да слуша допълнително (ние ще напишем кода за прехвърляне на връзката). И нашият втори сокет - m_pConnectSocket ще се занимава с пренос на данни. Пишем кода допълнително. В метода OnInitDialog задайте стойността за променливата на сокета m_pDlg (чрез извикване на метода SetParentDlg): Така променливата m_pDlg ще сочи към текущия диалогов прозорец. След това пишем методите OnAccept и OnReceive: Сега остава да напишем кода за бутона Listen. Чрез натискане на този бутон сокетът m_pListenSocket започва да слуша мрежата. Създайте манипулатор за този бутон и добавете следния код към него: Това е всичко с писането на сървър! В следващия урок ще напишем клиента. |