[BCB6] Работа с ServerSocket - Проблема в извлечение номера сокета!

Тема в разделе "LANGS.C", создана пользователем MuForum, 6 июл 2007.

  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Добрый день!

    Работаю на "BCB6" - "Borland C++ Builder 6.00". Столкнулся с такой проблемой, делаю ConnectServer.exe для игры, и мне необходимо при коннекте игроков считывать и запоминать номер сокета, Чтобы потом по этому номеру сокета отправить обратно информацию!

    - Всё бы хорошо, но компонент ServerSocket работает только со своими функциями и событиями, а с другой функцией(Самодельная) я не могу отправить информацию по сокету!


    То есть вопрос такой, как считать номер сокета и затем сохранить в какуе-то переменную, чтобы в дальнейшем работать с ним!?


    P.S. -> Просто у меня случай такой, что например первому клиенту мне надо отправить лишь список Серверов, а 7 клиенту, например уже надо отправить IP и Port GameServer.exe, чтобы он приконнектился. (Поэтому мне нужно именно работать с номерами сокетов, чтобы правильно отправлять информацию клиентам!)


    P.S. -> Прошу помочь опытных бойцов в этом деле, так как сам пока решить не могу, что-то не доходит до меня...
     
  2. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Объясняю более понятнее!

    Код (Text):
    1. //---------------------------------------------------------------------------
    2.  
    3. void __fastcall TForm1Main::ServerSocket1ClientConnect(TObject *Sender,
    4.       TCustomWinSocket *Socket)
    5. {
    6. bool banned=false;
    7.   if(ListBox1->Items->Count > 0)
    8.         {
    9.         for(int i=0; i<ListBox1->Items->Count; i++)
    10.         {
    11.         if(ListBox1->Items->Strings[i] == Socket->RemoteAddress)
    12.         {
    13.         banned=true;
    14.         }}}
    15.   if(banned)
    16.   {
    17.     if(WriteLog==1)
    18.     {
    19.     Memo1->Lines->Add("This '"+Socket->RemoteAddress+"' IP is Banned!");
    20.     Socket->Close();
    21.     }
    22.     else
    23.     {
    24.     Socket->Close();
    25.     }}
    26.   else
    27.   {
    28.   BYTE buf1[4];
    29.     ZeroMemory(buf1, 4);
    30.     memcpy(&(buf1[0]), "\xC1\x04\x00\x01", 4);
    31.  
    32.  
    33.   Socket->SendBuf(buf1, 4);
    34.   if(WriteLog==1)
    35.     {
    36.   Memo1->Lines->Add("User connected from this '"+Socket->RemoteAddress+"' IP.");
    37.     }
    38.   }        
    39. }
    40. //---------------------------------------------------------------------------
    41.  
    42. void __fastcall TForm1Main::ServerSocket1ClientRead(TObject *Sender,
    43.       TCustomWinSocket *Socket)
    44. {
    45.   char buf[MAXBUF];
    46.   ZeroMemory(&(buf[0]), MAXBUF);
    47.   int BytesRecved = 0;
    48.  
    49.   BytesRecved = Socket->ReceiveBuf(&(buf[0]), MAXBUF);
    50.  
    51.     PacketCore(LPBYTE(buf));
    52. }
    53. //---------------------------------------------------------------------------
    54.  
    55. void __fastcall TForm1Main::PacketCore(LPBYTE Packet)
    56. {
    57.    ...
    58.             if(sub==3)
    59.             {
    60.                 SendServerInfo(Packet);
    61.             }
    62.             else if(sub==6)
    63.             {
    64.                 ServersSend();
    65.             }
    66.    ...
    67. }
    68. //---------------------------------------------------------------------------
    69.  
    70. void __fastcall TForm1Main::SendServerInfo(LPBYTE Packet)
    71. {
    72.     ...
    73.  
    74.   Form1Main->ServerSocket1->Socket->Socket->Connections[вот тут мне необходимо указать номер сокета]->SendBuf(SendPacket, 0x16);
    75. }
    76. //---------------------------------------------------------------------------
    77. void __fastcall TForm1Main::ServersSend()
    78. {
    79.     ...
    80.  
    81.   Form1Main->ServerSocket1->Socket->Socket->Connections[вот тут мне необходимо указать номер сокета]->SendBuf(SendPacket, 0x16);
    82. }
    83. //---------------------------------------------------------------------------
    Проблема заключается в том, что это ConnectServer.exe и одновременно может быть 10 клиентов активны, но проблема в том, что например 8 клиент уже нажал на Суб-Сервер и надо отправить пакет с данными IP и Порта GameServer.exe, а 3 клиент только нажал на Сервер и необходимо отправить пакет с данными о Суб-Серверах!

    То есть мне необходимо точно знать номер сокета клиента, Чтобы правильно отправлять данные!


    P.S. -> Проблема в том, Что отправить вот таким образом не получается "Socket->SendBuf(SendPacket, 0x16);", так как эти функции идут самодельные и мне необходимо указывать номер сокета!


    P.S. -> Приложение одностороннее, поэтому и возникает такая проблема, если бы программа была двух сторонняя, то тут делать было бы нечего, так что прошу меня не отправлять на коды чатов, тут другой случай!
     
  3. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    # for all - Честно говоря, я хочу перейти на WinSock, то нормальной информации о принципе работе, нюансах и т.д. найти не могу, так что если кто-то может помочь мне с инфой по WinSock буду очень благодарен!


    P.S. -> Вычитал на одном Форуме, Что в WinSock можно извлекать номер сокета вот таким образом: "WSAccept" (Эта функция возвращает номер сокета), но тут есть нюанс(тоже вычитал уже на другом Форуме), что эту функцию можно использовать только при коннекте клиента! Ну и конечно, Это Win-API
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
  5. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    #4, censored - Прошу не смеятся, так как первое, я начал работать на BCB6 две недели назад, до этого работал на Delphi7, второе, с сокетами до этого я не работал!


    P.S. -> Если можешь подсказать - подскажи, а просто флудить и повышать счётчик сообщений не надо...
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    MuForum
    1. Давайте Вы будете поаккуратнее высказываться,
    2. Разве Socket.Handle (или что-то типа) не доступен? Просто не помню сейчас. Если недоступен, то можно написать наследника, где сделать доступ как к свойству.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    MuForum
    Посмотри TServerClientThread.