Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Шаблон клиент-сервера C++ WinSock

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Для начинающих] >> Шаблон клиент-сервера C++ WinSock
Имя
Сообщение << Старые топики   Новые топики >>
Шаблон клиент-сервера C++ WinSock - 2008-02-12 05:39:36.243333   
il0dbg

Сообщений: 66
Оценки: 0
Присоединился: 2007-10-30 01:32:31.366666
Может, кому пригодится:

Двух поточный консольный (без проблем можно водрать в приложение с GUI) клиент-сервер без применения сокетной синхронизации,
Из шаблона можно много чего хорошего слепить, можно использовать как многопользовательский
сервер, файлообменник, что угодно, лишь надо приложить фантазию.
Пример не отличается оригинальностью, это ШАБЛОН, чтобы другие не изобретали велосипед.

(стоит обратить внимание на _SRVCL)


#include <winsock.h>
#include <windows.h>
#include <malloc.h>
#define addr "666.666.666.666"
#define clport 555
#define srvport 444
typedef struct _SRVCL
{
 char server;
 char client;
 SOCKET clientsock;
 sockaddr_in clientaddress;
 int claddrsize;
} SRVCL,*PSRVCL;
DWORD WINAPI ClThreadFunc(LPVOID noth);
DWORD WINAPI SrvThreadFunc(LPVOID noth);
DWORD WINAPI ClThreadFunc(LPVOID noth)
{
 PSRVCL prdata;
 prdata=(PSRVCL)noth;
 WSADATA wd;
 WSAStartup(0x0202,&wd);
 //===================================================
 char buf[1000];
 //===================================================
 while(1)
 {
     if((*prdata).client==1){
         printf("Start sending\n");
         connect((*prdata).clientsock,(sockaddr*)&((*prdata).clientaddress),(*prdata).claddrsize);    
         memset(&buf[0],0,1000);
         memcpy(&buf[0],&"Hello from server!\n",strlen(&"Hello from server!\n"));
         send((*prdata).clientsock,&buf[0],1000,0);
         closesocket((*prdata).clientsock);
         (*prdata).server=1;
         (*prdata).client=0;
     };
 };
WSACleanup();
 return 0;
};
DWORD WINAPI SrvThreadFunc(LPVOID noth)
{
 WSADATA wd;
 WSAStartup(0x0202,&wd);
 PSRVCL prdata;
 prdata=(PSRVCL)noth;
 //===================================================
 SOCKET srvsock;
 SOCKET clsock;
 sockaddr_in claddr;
  int claddrsize=sizeof(claddr);
  sockaddr_in servaddr;
 servaddr.sin_family=AF_INET;
 servaddr.sin_port=htons(srvport);
 servaddr.sin_addr.s_addr=0;
 srvsock=socket(AF_INET,SOCK_STREAM,0);
 bind(srvsock,(sockaddr*)&servaddr,sizeof(servaddr));
 listen(srvsock,10);
 char buf[1000];
 memset(&buf[0],0,1000);
  //===================================================
  while(1){
     if((*prdata).server==1){
         printf("Server active\n");
          clsock=accept(srvsock,(sockaddr*)&claddr,&claddrsize);
         printf("accepted\n");
         recv(clsock,&buf[0],1000,0);
         printf(&buf[0]);
         (*prdata).server=0;
         (*prdata).client=1;
         (*prdata).clientsock=clsock;
          (*prdata).clientaddress=claddr;
         (*prdata).claddrsize=claddrsize;
     };
 };
 WSACleanup();
 return 0;
};
int main(int argc, char* argv[])
{
 DWORD ClProcId,SrvProcId;
 SRVCL rdata;
 rdata.client=0;
 rdata.server=1;
 CreateThread(NULL,NULL,ClThreadFunc,&rdata,NULL,&ClProcId);
 CreateThread(NULL,NULL,SrvThreadFunc,&rdata,NULL,&SrvProcId);
 getchar();
 return 0;
}




Post #: 1
Страниц:  [1]
Все форумы >> [Для начинающих] >> Шаблон клиент-сервера C++ WinSock







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.