Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Console app + TServerSocket/TClientSocket 
:(
    Опции темы
extremale
  Дата 3.10.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.10.2010

Репутация: нет
Всего: нет



Здравствуйте ув. форумчане, пишу консольную программу с использованием сокетов, но никак не могу разобраться с их Событиями (OnConnect, OnRead и т.д.). Помогите разобраться с проблемой...

Вот код класса, скорее всего тут ошибка.
Код

class CServerSocket : public TServerSocket
{
public:
  __fastcall CServerSocket(Classes::TComponent* AOwner);
private:
  void __fastcall ClientConnect(TObject *Sender,
  TCustomWinSocket *Socket);
  void __fastcall ClientRead(TObject *Sender,
  TCustomWinSocket *Socket);
  void __fastcall Accept(TObject *Sender, TCustomWinSocket *Socket);
};
 
__fastcall CServerSocket::CServerSocket(Classes::TComponent* AOwner):TServerSocket(AOwner)
{
this->OnAccept = Accept;
this->OnClientConnect = ClientConnect;
this->OnClientConnect = ClientRead;
}
 
void __fastcall CServerSocket::ClientConnect(TObject *Sender,
  TCustomWinSocket *Socket)
{
 cout<<"1\n";
}
 
void __fastcall CServerSocket::Accept(TObject *Sender, TCustomWinSocket *Socket)
{
 cout<<"2\n";
}
 
void __fastcall CServerSocket::ClientRead(TObject *Sender,TCustomWinSocket *Socket)
{
 cout<<"3\n";
}


P.S. Компилятор не выдает ошибок.
P.S.S. "Жду ответа как соловей лета."
PM MAIL   Вверх
XPyCT
Дата 13.12.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: 10
Всего: 10



советую почитать господина Флеонова 
программирование на c++ глазами хакера

ну а по сути вот код от туда
TCP сервер:
Функции должны быть именно в таком порядке: сначала ClientThread, а затем — NetThread. 
Код

DWORD WINAPI ClientThread(LPVOID lpParam)
{
    SOCKET    sock=(SOCKET)lpParam;
    char    szRecvBuff[1024],
        szSendBuff[1024];
    int    ret;
    // Запуск бесконечного цикла
    while(1)
    {
        // Получение данных
        ret = recv(sock, szRecvBuff, 1024, 0);
        // Проверка полученных данных
        if (ret == 0)
            break;
        else if (ret == SOCKET_ERROR)
        {
            MessageBox(0, "Recive data filed", "Error", 0);
            break;
        }
        szRecvBuff[ret] = '\0';
    
        // Здесь можно поставить проверку принятого текста
        // в переменной szRecvBuffer

        // Подготовка строки для отправки клиенту
        strcpy(szSendBuff, "Command get OK");

        // Отправка содержимого переменной szSendBuff клиенту
        ret = send(sock, szSendBuff, sizeof(szSendBuff), 0);
        if (ret == SOCKET_ERROR)
        {
            break;
        }
    }
    return 0;
}



Код

DWORD WINAPI NetThread(LPVOID lpParam)
{
    SOCKET    sServerListen,
        sClient;
    struct sockaddr_in localaddr,
            clientaddr;
    HANDLE    hThread;
    DWORD    dwThreadId;
    int    iSize;

    // Создание сокета
    sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sServerListen == SOCKET_ERROR)
    {
        MessageBox(0, "Can't load WinSock", "Error", 0);
        return 0;
    }
    // Заполнение структуры localaddr типа sockaddr_in
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);

    // Связывание адреса с переменной localaddr типа sockaddr_in
    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
        sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }

    // Вывод сообщения об удачной операции bind
    MessageBox(0, "Bind OK", "Error", 0);

    // Запуск прослушивания порта
    listen(sServerListen, 4);

    // Вывод сообщения об удачном начале операции прослушивания
    MessageBox(0, "Listen OK", "Error", 0);

    // Запуск бесконечного цикла
    while (1)
    {
        iSize = sizeof(clientaddr);
        // Прием соединения из очереди. Если его нет,
        // то функция будет ожидать соединения клиента
        sClient = accept(sServerListen, (struct sockaddr *)&clientaddr,
                &iSize);
        //Проверка корректности идентификатора клиентского сокета
        if (sClient == INVALID_SOCKET)
        {        
            MessageBox(0, "Accept filed", "Error", 0);
            break;
        }

        // Создание нового потока для работы с клиентом
        hThread = CreateThread(NULL, 0, ClientThread, 
            (LPVOID)sClient, 0, &dwThreadId);
        if (hThread == NULL)
        {
            MessageBox(0, "Create thread filed", "Error", 0);
            break;
        }
        CloseHandle(hThread);
    }
    // Закрытие сокета после работы с потоком
    closesocket(sServerListen);
    return 0;
}




скачайте книгу там CHTML. В  разделе  4.7 найдете для себя все ответы. CD прилагается
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.