int main() { Send_que=new AQueue(size_que); Log_que=new AQueue(size_que); Conn_que=new AQueue(size_que); type_parser=new QueTypeParser(3); type_parser->AddPair(&_typeSend,Send_que); type_parser->AddPair(&_typeLog,Log_que); type_parser->AddPair(&_typeNotify,Conn_que); int listener; int qwe=0;//-----------------????????????????????? struct sockaddr_in addr; char buf[size_buf];//--for recv int bytes_read;//-- for recv listener = socket(AF_INET, SOCK_STREAM, 0); if(listener < 0) { perror("socket"); return 1; } fcntl(listener, F_SETFL, O_NONBLOCK);//non-block addr.sin_family = AF_INET; addr.sin_port = htons(3425); //addr.sin_addr.s_addr = 0x6C000D0A; //addr.sin_addr.s_addr = 0x0100007F; addr.sin_addr.s_addr=INADDR_ANY; if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 2; } listen(listener, 2); //************************** threads BEGIN cout<<thread_start()<<" - result creating thread"<<endl; //************************** threads END int k=0; while(1) { k++; // Заполняем множество сокетов fd_set readset; FD_ZERO(&readset); FD_SET(listener, &readset); for (int i=0;i<cl.RealClient();i++) { FD_SET(cl.Socket(i), &readset); } // Задаём таймаут /*timeval timeout; timeout.tv_sec = 15; timeout.tv_usec = 0;*/ int mx; if (listener>mymax()) mx=listener; else mx=mymax(); // Ждём события в одном из сокетов if(select(mx+1, &readset, NULL, NULL, NULL) <= 0) { perror("select"); return 3; } // Определяем тип события и выполняем соответствующие действия if(FD_ISSET(listener, &readset)) { // Поступил новый запрос на соединение, используем accept int sock = accept(listener, NULL, NULL); if(sock < 0) { perror("accept"); return 3; } fcntl(sock, F_SETFL, O_NONBLOCK); int flag=0; cout<<"--------------ДО добавления-----------------\n"; for (int qq=0;qq<cl.RealClient();qq++) { if (cl.Nick(qq)=="") cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<"NULL"<<endl; else cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<cl.Nick(qq)<<endl; } cout<<"-----------------------------------------------\n"; cl.WriteNew(sock);// проверить return cout<<"--------------После добавления-----------------\n"; for (int qq=0;qq<cl.RealClient();qq++) { if (cl.Nick(qq)=="") cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<"NULL"<<endl; else cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<cl.Nick(qq)<<endl; } cout<<"-----------------------------------------------\n"; } //создаем обьекты для постановки их в очереди................. for (int i=0;i<cl.RealClient();i++) { if(FD_ISSET(cl.Socket(i), &readset)) { // Поступили данные от клиента, читаем их bytes_read = recv(cl.Socket(i), buf, size_buf, 0);//реально вернет кол-во байт указанных на стoроне клиента!!!!! cout<<"--server.c: socket RECV: "<<cl.Socket(i)<<" byte RECV: "<<bytes_read<<endl; buf[bytes_read]='\0'; if(bytes_read <= 0) { // Соединение разорвано, удаляем сокет из множества close(cl.Socket(i)); cl.setSocket(i,-1); //рассылка юзерам о дисконнекте пользователя if(cl.Nick(i)[0]!='#') { IMessage* connmes=new Message(""); connmes->AddPart(_o,"disconnect"); connmes->AddPart(_s,cl.Nick(i)); Conn_que->Write(connmes); delete connmes; } cl.setNick(i,""); //----------------------------------------- cout<<"--------------После закрытия-----------------\n"; for (int qq=0;qq<cl.RealClient();qq++) { if (cl.Nick(qq)=="") cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<"NULL"<<endl; else cout<<"server.c: sock "<<cl.Socket(qq)<<" nick "<<cl.Nick(qq)<<endl; } cout<<"-----------------------------------------------\n"; continue; } else { Message* msg; string buffer=buf; cout<<" length bufer "<<buffer.length()<<endl; msg=new Message(buffer); cout<<buffer<<endl; cout<<"TEST NICK"<<cl.Nick(i)<<endl; msg->AddPart(_s,cl.Nick(i)); AQueue* tmp=type_parser->TypeParse(buffer); if (tmp!=NULL) tmp->Write(msg); delete msg; } }//if }//for }//while return 0; }