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; }
|