Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с winsock 
:(
    Опции темы
ScoL
Дата 25.4.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я облазил весь форум, и не нашел нигде примеров для C++ builder, все статьи и примеры для visual C++,дайте плиз примерчик для bcb 6.0
PM MAIL   Вверх
SenkraD
Дата 25.4.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну для BCB есть компоненты TServerSocket и TClientSocket (я их не очень люблю)
а по поводу Winsock, то это WinAPI и она одинаково работает как в Visual C++ так и в Builder это я лично проверял и не раз , так как пишу в обоих средах



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ScoL
Дата 25.4.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(SenkraD @ 25.4.2007,  18:23)
Ну для BCB есть компоненты TServerSocket и TClientSocket (я их не очень люблю)
а по поводу Winsock, то это WinAPI и она одинаково работает как в Visual C++ так и в Builder это я лично проверял и не раз , так как пишу в обоих средах

Дело в том, что когда я переписываю код примера он у меня не компилируется выдает кучу ошибок, я просто не знаю куда помещать функции(создания сокета и тд), если не трудно не могли бы вы привести пример создания сервера по событию onclick кнопки
PM MAIL   Вверх
ScoL
Дата 25.4.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С этой проблемой я разобрался (хотя некоторые вопросы остались), но теперь при создании сервера(т.е. при создании сокета и ожидании клиентов) приложение виснет, что делать ?? 
помогите плиз... заранее спасибо.
PM MAIL   Вверх
SenkraD
Дата 25.4.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код выложи - там где у виснет


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ScoL
Дата 26.4.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

Memo1->Lines->Add("Waiting connect from client.");
int ClientSock;
int accept_sin_len;
accept_sin_len = sizeof (accept_sin);
ClientSock = accept (WinSocket,
                         (struct sockaddr *) &accept_sin,
                         (int *) &accept_sin_len);
closesocket (WinSocket);

PM MAIL   Вверх
SenkraD
Дата 26.4.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ScoL,  а более полную версию кода

Вот самый постой вариант
Код

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

    strcpy(szSendBuff, "Command get OK");

        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.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);

    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
            sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    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;
}


Это сообщение отредактировал(а) SenkraD - 26.4.2007, 14:24


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ScoL
Дата 26.4.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот
Код

WSADATA WSAData;
if (WSAStartup (MAKEWORD(2,1), &WSAData) != 0)
{
// Сообщение об ошибке
}
int WinSocket;
if ((WinSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
// Сообщение об ошибке
}
#define PORTNUM 1024
SOCKADDR_IN local_sin, accept_sin;
local_sin.sin_family = AF_INET;
local_sin.sin_port = htons (PORTNUM);
local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (WinSocket,
           (struct sockaddr *) &local_sin,
            sizeof (local_sin)) == SOCKET_ERROR)
{
// Сообщение об ошибке
  closesocket (WinSocket);
}
#define max_clients
if (listen (WinSocket, max_clients) == SOCKET_ERROR)
{
// Сообщение об ошибке
  closesocket (WinSocket);
}
Memo1->Lines->Add("Waiting connect from client.");
int ClientSock;
int accept_sin_len;
accept_sin_len = sizeof (accept_sin);
ClientSock = accept (WinSocket,
                         (struct sockaddr *) &accept_sin,
                         (int *) &accept_sin_len);
closesocket (WinSocket);

а ваш код не компилируется выдает ошибки:
[C++ Error] server.cpp(65): E2108 Improper use of typedef 'DWORD'
[C++ Error] server.cpp(65): E2379 Statement missing ; (непонятно почему вроде все стоит)

Это сообщение отредактировал(а) ScoL - 26.4.2007, 14:48
PM MAIL   Вверх
SenkraD
Дата 26.4.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По вашему коду
Код

#define max_clients//Чему оно равно


А мой код был рабочий на 100% - я на основе него другу обьснял и всё работало как под студией так и под Builder'ом



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ScoL
Дата 26.4.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(SenkraD @ 26.4.2007,  15:05)
По вашему коду
Код

#define max_clients//Чему оно равно


А мой код был рабочий на 100% - я на основе него другу обьснял и всё работало как под студией так и под Builder'ом

это я неправильно скопировал ) вообще было равно 50
PM MAIL   Вверх
SenkraD
Дата 26.4.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кажись так правильно
Код

ClientSock = accept (WinSocket,    
                         (struct sockaddr *) &accept_sin,    
                        &accept_sin_len);


+ плюс accept нужно по бесконечному циклу вызывать + accept блокирует программу пока не прийдёт сокет поэтому в моеё примере создавал поток NetThread, который принимал запросы от клиентов, а потом передавал их на обработку в ClientThread


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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