Регистрация Забыли пароль?
Логин
Пароль
Запомнить меня
Вход через ВКонтакте
Главная > Статьи > Мультипоточний чат на сокетах С++

Многопоточных чат на C++ Socket

С целью изучения Socket в C был разработан чат очень упрощенный чат по типу icq. Для реализации чате использовано собственный класс cSocket который инкапсулирует вызов API функций для работы с сокетами.

Общий принцип работы чата - создается отдельный поток в котором создается сокет сервер. Этот сокет сервер Постоянного прослушивает порт на счет подключений с любого компьютера. В основном потоке создается "вечный" цикл, обрабатывает клавиатурный ввод пользователя.

Ви можете скачать исходники


// підключаем файли

#include "stdafx.h"

#include 

#include 

#include 

#include 

#include 

#include 

// подключаеи класс-"обертку" socket API

#include "cSocket.h" 



#define InputLength 1024



using namespace std;



int nBindPort = 2155;

int nConnPort = 2155;

bool bClientConnected = false;



// функция будет выполняться в неосновном потоке

// и постоянно слушать порт и ждать входящие оообщения

unsigned __stdcall RunChatSrv(void* Srv) {

 // создаем сокет для сервера

 cSocket* SockSrv = (cSocket*)Srv;

 // подключемся к заданому порту

 SockSrv->BindPort(nBindPort, 1);

 std::cout << "Start server thread. Bind port " << 

 nBindPort << std::endl;



 // ждем клиентского подключения

 while(true) {

  int Res = 0;

  // при подключении клиента создаем сокет для его обслужывания

  cSocket* Client = SockSrv->Accept(Res);

  std::string strRb;

  if (Res == 1) { // если подключение успешно

   strRb = Client->ReceiveBytes(); // получаем информацию от клиента

   if (!strRb.empty()) { // если чтото получили

    Client->SendLine("OK"); // посылаем подтверждение получения

    // виводим полученую строку на екран + ip адресс подключеног оклиента

    std::cout << inet_ntoa(Client->saiSockAddr.sin_addr) << "-> " << strRb << std::endl;

   }

   // освобождаем память занятую Client

   delete Client;

  }

 }

}



// функция передачи сообщений

int sendChatMessage(const char* szIP,const char* szMess, bool bConnect = true) {

 int Res = 0;

 // создание клиентского сокета

 cSocket* SockCl = new cSocket;

 // подключаемся к указаному адресу и порту

 if (SockCl->Connect(szIP, nConnPort)) {

   // шлем сообщение

   SockCl->SendLine(szMess);

   // пробуем получить подтвердждение

   std::string Answ = SockCl->ReceiveBytes();

   if (Answ.find("OK") == 0) {

    Res = 1;

    bClientConnected = true;

    if (bConnect) {

     std::cout << "successfull connect to " << 

      szIP << ":" << nConnPort << std::endl;

    }

   }

 } else {

   bClientConnected = false;

   std::cout << "error when try connect to " << 

   szIP << ":" << nConnPort << std::endl;

 }

 delete SockCl;

 return Res;

}



int getStrLen(const char* cszData) {

	int nLen = 0;

	while(*cszData++) {

	 nLen++;

	}

	return nLen;

}



int main(int argc, char* argv[]) {

	cSocket* SockSrv = new cSocket;

	

	std::cout << "Type Port ty Bindn";

	std::cin >> nBindPort;



	std::cout << "Type Port ty Connectn";

	std::cin >> nConnPort;



	unsigned int nSrvThRes;

  // создаем поток для выполнения главной фн сервера

  _beginthreadex(0, 0, RunChatSrv,(void*) SockSrv, 0, &nSrvThRes);



	char szInput[InputLength];

	string strInput;



	std::string strIP = "";



	int nStrLn = 0;

 

 // цыкл приема команд от пользователя

 while(1) {

   cin.getline(szInput, InputLength);

   nStrLn = getStrLen(szInput);

   strInput.assign(szInput, nStrLn);

   if (strInput.empty()) {

    continue;

   }

   if (strInput.find("exit") == 0) {

    break;

   }

   basic_string ::size_type stIdx = strInput.find("conn ");

   if (stIdx != string::npos) {

     strIP = strInput.substr(stIdx + 5);

     sendChatMessage(strIP.c_str(), "try connectn");

   } else {

     if (bClientConnected) {

      sendChatMessage(strIP.c_str(), strInput.c_str(), false);

     } else {

      std::cout << "you must connect first use command "conn 127.0.0.1"" << std::endl;

     }

   }

 }

 

 delete SockSrv;



 return 0;

}

Если у вас возникли вопросы, задавайте их в коментариях

Вы можете добавить коментарий на етой странице или на странице форума тут.Постов 18.

Последний комментарий

13.04.2017
viagra dose size forum actions
http://viagra-withoutadoctor.com - viagra without a doctor prescription usa
buy viagra in goa
viagra without prescription
- viagra canadian pharmacy online moderators
viagra 20mg find all posts by
13.07.2016

Имя*E-mail
Код*