С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 23.09.2012
Сообщений: 83
1

не читает сокет ни в какую

13.12.2012, 18:16. Показов 1189. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Бьюсь уже долго над проблемой и все безрезультатно, проблема в том, что данные не хотят ни пересылаться, ни считываться, хотя все делал по гайдам, перепроверял 100 раз, разные способы делал и ничего, а курсовую уже скоро сдавать, помогите пожалуста. Концепция такая: сервер привязывается к своему ip и создает поток с функцией accept, которая в свою очередь создает потоки для клиентов, если те подключаются и в функции потока клиента идет обмен, там-то я и проверял select'ом что нет готовых для чтения\записи соединений! как, если accept выполнился без ошибок, верно определив данные клиента, сокет конкретного клиента везде один даже сделал, и в поток клиента передавал только номер сокета из массива сокетов, который объявлен глобально! ниже код выложу относящийся к этому, кто может, подскажите.
Глобальные переменные:
C++
1
2
3
4
5
6
7
8
9
10
11
DWORD WINAPI SendToClient(LPVOID i);
HANDLE hThread[MAX_THREADS];
DWORD thID[MAX_THREADS];
DWORD WINAPI ReQueue(LPVOID lpParametr);
HANDLE hThreadQ;
DWORD thIDQ;
SOCKET ClientSocketArr[MAX_THREADS];
int result;
bool run=true;
WSADATA wsaData;
SOCKET ConnectSocket=INVALID_SOCKET;
Функция запуска сервера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void __fastcall TForm1::serverstart(){
char buff[1024];
//Инициализация winsock
result=WSAStartup(MAKEWORD(2,2), &wsaData);
if(result!=0){
    Memo2->Lines->Add("> WSAStartup failed with error: "+IntToStr(result));
    WSACleanup();
}
//Заполнение данных
char *ip=IdIPWatch1->LocalIP().t_str();
addrinfo conin;
sockaddr_in conad;
conad.sin_family=AF_INET;
conad.sin_port=htons(MY_PORT);
conad.sin_addr.s_addr=0;
 
conin.ai_family=AF_INET;
conin.ai_socktype=SOCK_STREAM;
conin.ai_protocol=0;
conin.ai_addrlen=strlen(ip);
//Создание сокета
ConnectSocket=socket(conin.ai_family, conin.ai_socktype, conin.ai_protocol);
if(ConnectSocket == INVALID_SOCKET){
    Memo2->Lines->Add("> Socket failed with error: "+(AnsiString) WSAGetLastError());
    WSACleanup();
}
//Связывание
result=bind(ConnectSocket, (sockaddr *) &conad, sizeof(conad));
if(result==SOCKET_ERROR){
    Memo2->Lines->Add("> Error: bind "+(AnsiString) WSAGetLastError());
    ConnectSocket = INVALID_SOCKET;
    closesocket(ConnectSocket);
    WSACleanup();
}
//Начало прослушивания
result=listen(ConnectSocket, 0x100);
if(result!=0){
    Memo2->Lines->Add("> Error: listen Socket "+(AnsiString) WSAGetLastError());
    closesocket(ConnectSocket);
    WSACleanup();
}
if(result==0)Memo2->Lines->Add("> Waiting for connection...");
//Поток очереди
hThreadQ=CreateThread(NULL, 0, ReQueue, NULL, 0, &thIDQ);
Функция потока ожидания соединения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DWORD WINAPI ReQueue(LPVOID lpParametr){
    sockaddr_in ClientAddr;
    int client_addr_size=sizeof(ClientAddr);
//Запросы на подключение
    while(run=true){
            int i=0;
            while(i<MAX_THREADS && hThread[i]!=NULL)i++;
            if(i<MAX_THREADS){
                ClientSocketArr[i]=accept(ConnectSocket,(sockaddr *) &ClientAddr, &client_addr_size);
                //Получение имя хоста
                HOSTENT *hst;
                hst=gethostbyaddr((char *) &ClientAddr.sin_addr.s_addr, 4, AF_INET);
                //Вывод информации о клиенте
                Form1->Memo2->Lines->Add("> New connect! "+(AnsiString) hst->h_name+" "+(AnsiString)    inet_ntoa(ClientAddr.sin_addr));
                nclients++;
                PRINTNUSERS
                hThread[i]=CreateThread(NULL, 0, SendToClient, &i, 0, &thID[i]);
                if(hThread[i]==NULL)Form1->Memo2->Lines->Add("> Error: Fail CreateThread");
            }
            else Form1->Memo2->Lines->Add("> Error: Server is full");
    }
    return 0;
}
Функция потока клиента:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DWORD WINAPI SendToClient(LPVOID i){
    //SOCKET MySock;
    int k= *(unsigned int*)i;
    //MySock=((SOCKET) ClientSocket);//[0];
    char buff[20*1024];
    #define sHELLO "Hello!"
    //send(MySock,sHELLO,sizeof(sHELLO),0);
    int bytes_recv;//=recv(MySock,buff,sizeof(buff),0);
    fd_set read_s;
    fd_set write_s;
    fd_set error_s;
    timeval time_out;
    FD_ZERO (&read_s);
    FD_ZERO (&write_s);
    FD_ZERO (&error_s);
    FD_SET (ClientSocketArr[k], &read_s);
    FD_SET (ClientSocketArr[k], &write_s);
    FD_SET (ClientSocketArr[k], &error_s);
    time_out.tv_sec = 2;
    int res = select (0, &read_s, &write_s, &error_s, &time_out);
//это как раз цикл бесконечность, где не работает отправка и прием(закоментил дабы проверить select)
/*  while(ClientSocketArr[k]!=INVALID_SOCKET){
        //send(ClientSocketArr[k],buff,bytes_recv,0);
        bytes_recv=recv(ClientSocketArr[k],buff,sizeof(buff),0);
        if(bytes_recv!=SOCKET_ERROR){
            Form1->Memo1->Lines->Add("YO! "+(AnsiString) buff);
            send(ClientSocketArr[k],buff,bytes_recv,0);
            ClientSocketArr[k]=INVALID_SOCKET;
            PRINTDISC
        }
    }*/
    nclients--;
    PRINTNUSERS
    Form1->Memo1->Lines->Add("res= "+IntToStr(res));
    ClientSocketArr[k]=INVALID_SOCKET;
    shutdown(ClientSocketArr[k],SD_BOTH);
    closesocket(ClientSocketArr[k]);
    return 0;
}
Добавлено через 12 минут
еще там где функция ожидания соединения был такой вариант, который тоже при проверке селектом -1 давал, думал из-за переприсвоения "ClientSocketArr[i]=ClientSocket;":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SOCKET ClientSocket;
    sockaddr_in ClientAddr;
    int client_addr_size=sizeof(ClientAddr);
while((ClientSocket=accept(ConnectSocket,(sockaddr *) &ClientAddr, &client_addr_size))){
        qclients++;
        //Получение имя хоста
        HOSTENT *hst;
        hst=gethostbyaddr((char *) &ClientAddr.sin_addr.S_un.S_addr, 4, AF_INET);
        //Вывод информации о клиенте
        Form1->Memo2->Lines->Add("> New connect! "+(AnsiString) hst->h_name+" "+(AnsiString) inet_ntoa(ClientAddr.sin_addr));
        int i=0;
        while(i<MAX_THREADS && hThread[i]!=NULL)i++;
        if(i<MAX_THREADS){
            nclients++;
            qclients--;
            PRINTNUSERS
            ClientSocketArr[i]=ClientSocket;
            hThread[i]=CreateThread(NULL, 0, SendToClient, &i, 0, &thID[i]);
        }
        else Form1->Memo2->Lines->Add("> Error: Server is full");
        if(hThread[i]==NULL)Form1->Memo2->Lines->Add("> Error: Fail CreateThread");
        closesocket(ClientSocket);
    }*/
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2012, 18:16
Ответы с готовыми решениями:

Какую материнку лучше выбрать на 478 сокет
Всем привет,вот хочу купить материнку на 478 сокете и у меня еть 2 выбора это Gigabyte Ga-8pe800rs...

Написать простое многопоточное приложение, которое в основном потоке читает непрерывно какую-либо информацию и показывает её
Ребята, хелп! Короче, я программирую в С++, но делаю там сугубо физические расчеты, строю...

Материнка 775 сокет и процессор 771 сокет, Совместимость
Ребят помогите пожалуйста, попробовал разобраться Сам и только запутался больше... Вообщем...

4 планки Apacer DDR3 по 4Gb/1333MHz от старой МВ сокет 775 могу ли я их использовать на сокет 2011
недавно решил перейти с LGA775 на LGA2011. Финансы урезаны поэтому пока приобрёл только процессор...

0
13.12.2012, 18:16
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2012, 18:16
Помогаю со студенческими работами здесь

Как только происходит попытка создать сокет для UDP - сокет TCP сразу ломается (выдает 10093).
Добрый день. Пытаюсь сделать соединение, использующее два канала обмена данными - TCP для...

Не могу понять почему Яндекс не читает мой Sitemap? а google читает.
Захожу в яндекс мастер выбираю sitemap а он мне пишет ошибка в файле sitemap невалидный sitemap Но...

Проблема с OCR Puma.Net (читает текст с одной картинки, но не читает с другой)
Здравствуйте, есть проект с оцр Puma.Net и есть 2 картинки 1ая и 2ая, только вот с первой картинки...

USBasp неправильно читает Flash, но правильно читает EEprom
Ребята выручайте, нужен мозговой штурм... Пару лет назад собрал USBasp, до недавнего времени...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru