Добрый день! Работаю на "BCB6" - "Borland C++ Builder 6.00". Столкнулся с такой проблемой, делаю ConnectServer.exe для игры, и мне необходимо при коннекте игроков считывать и запоминать номер сокета, Чтобы потом по этому номеру сокета отправить обратно информацию! - Всё бы хорошо, но компонент ServerSocket работает только со своими функциями и событиями, а с другой функцией(Самодельная) я не могу отправить информацию по сокету! То есть вопрос такой, как считать номер сокета и затем сохранить в какуе-то переменную, чтобы в дальнейшем работать с ним!? P.S. -> Просто у меня случай такой, что например первому клиенту мне надо отправить лишь список Серверов, а 7 клиенту, например уже надо отправить IP и Port GameServer.exe, чтобы он приконнектился. (Поэтому мне нужно именно работать с номерами сокетов, чтобы правильно отправлять информацию клиентам!) P.S. -> Прошу помочь опытных бойцов в этом деле, так как сам пока решить не могу, что-то не доходит до меня...
Объясняю более понятнее! Код (Text): //--------------------------------------------------------------------------- void __fastcall TForm1Main::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { bool banned=false; if(ListBox1->Items->Count > 0) { for(int i=0; i<ListBox1->Items->Count; i++) { if(ListBox1->Items->Strings[i] == Socket->RemoteAddress) { banned=true; }}} if(banned) { if(WriteLog==1) { Memo1->Lines->Add("This '"+Socket->RemoteAddress+"' IP is Banned!"); Socket->Close(); } else { Socket->Close(); }} else { BYTE buf1[4]; ZeroMemory(buf1, 4); memcpy(&(buf1[0]), "\xC1\x04\x00\x01", 4); Socket->SendBuf(buf1, 4); if(WriteLog==1) { Memo1->Lines->Add("User connected from this '"+Socket->RemoteAddress+"' IP."); } } } //--------------------------------------------------------------------------- void __fastcall TForm1Main::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { char buf[MAXBUF]; ZeroMemory(&(buf[0]), MAXBUF); int BytesRecved = 0; BytesRecved = Socket->ReceiveBuf(&(buf[0]), MAXBUF); PacketCore(LPBYTE(buf)); } //--------------------------------------------------------------------------- void __fastcall TForm1Main::PacketCore(LPBYTE Packet) { ... if(sub==3) { SendServerInfo(Packet); } else if(sub==6) { ServersSend(); } ... } //--------------------------------------------------------------------------- void __fastcall TForm1Main::SendServerInfo(LPBYTE Packet) { ... Form1Main->ServerSocket1->Socket->Socket->Connections[вот тут мне необходимо указать номер сокета]->SendBuf(SendPacket, 0x16); } //--------------------------------------------------------------------------- void __fastcall TForm1Main::ServersSend() { ... Form1Main->ServerSocket1->Socket->Socket->Connections[вот тут мне необходимо указать номер сокета]->SendBuf(SendPacket, 0x16); } //--------------------------------------------------------------------------- Проблема заключается в том, что это ConnectServer.exe и одновременно может быть 10 клиентов активны, но проблема в том, что например 8 клиент уже нажал на Суб-Сервер и надо отправить пакет с данными IP и Порта GameServer.exe, а 3 клиент только нажал на Сервер и необходимо отправить пакет с данными о Суб-Серверах! То есть мне необходимо точно знать номер сокета клиента, Чтобы правильно отправлять данные! P.S. -> Проблема в том, Что отправить вот таким образом не получается "Socket->SendBuf(SendPacket, 0x16);", так как эти функции идут самодельные и мне необходимо указывать номер сокета! P.S. -> Приложение одностороннее, поэтому и возникает такая проблема, если бы программа была двух сторонняя, то тут делать было бы нечего, так что прошу меня не отправлять на коды чатов, тут другой случай!
# for all - Честно говоря, я хочу перейти на WinSock, то нормальной информации о принципе работе, нюансах и т.д. найти не могу, так что если кто-то может помочь мне с инфой по WinSock буду очень благодарен! P.S. -> Вычитал на одном Форуме, Что в WinSock можно извлекать номер сокета вот таким образом: "WSAccept" (Эта функция возвращает номер сокета), но тут есть нюанс(тоже вычитал уже на другом Форуме), что эту функцию можно использовать только при коннекте клиента! Ну и конечно, Это Win-API
#4, censored - Прошу не смеятся, так как первое, я начал работать на BCB6 две недели назад, до этого работал на Delphi7, второе, с сокетами до этого я не работал! P.S. -> Если можешь подсказать - подскажи, а просто флудить и повышать счётчик сообщений не надо...
MuForum 1. Давайте Вы будете поаккуратнее высказываться, 2. Разве Socket.Handle (или что-то типа) не доступен? Просто не помню сейчас. Если недоступен, то можно написать наследника, где сделать доступ как к свойству.