С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10

Сокеты: не отправляет данные

18.04.2013, 17:57. Показов 2988. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал простую программку которая конектится к серверу и авторизируется методом Digest, но после отправки первой посылки и получения данных, не могу отправить вторую, т.е. он отправляет но нечего не читает и на сервере куда делаю запрос вторая посылка не доходит.

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
//создаю сокет:
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
...
//произвожу конект
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
 
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)   {
                perror("connect");
                return false;
}
...
//отправка первой посылки:
if(send(sock, _message, strlen(_message), 0)<0){
                    perror("send");
                    return false;
                }
//получаю данные
sizePoz = 0;
                do{
                    sizePoz = recv(sock, (char*)bufer+sizePoz, sizeof(bufer), 0);
                }while(sizePoz>0);  
...
//обрабатываю их
... 
//отправляю вторую посылку (ошибку не какую не выдает)
if(send(sock, _temp, strlen(_temp), 0)<0){
            perror("send");
            return false;
        }
...
//читаю данные (постоянно считывает 0 или просто иногда выдает ошибку 10053)
do{
                    sizePoz = recv(sock, (char*)bufer+sizePoz, sizeof(bufer), 0);
                }while(sizePoz>0);
Подскажите на что обратить внимание или куда копать ....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2013, 17:57
Ответы с готовыми решениями:

Send (Winsock) не отправляет данные больше 1 раза
Send (Winsock) не отправляет данные больше 1 раза. Сервер я проверил telnet'ом - он абсолютно рабочий. Вот с клиентом проблема....

Сокеты: клиент не принимает данные
Написал простой консольный чат. Почему в клиенте функция recv возвращает ошибку 10038? Сервер: #include &quot;stdafx.h&quot; ...

Не отправляет данные в БД
if($_SESSION&amp;&amp; isset($_POST)) { foreach($_POST as $ArrKey =&gt; $ArrStr) { $ArrKey=$_POST; } ...

22
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
19.04.2013, 03:19
коды ошибок смотрел ? какие ?
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 09:31  [ТС]
Да код ошибок смотрел, не возникает ни каких. Только в некоторых случает когда 2 посылку отправляешь и пытаешься читать бывает возникает ошибка 10053 (разрыв соединения).
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.04.2013, 10:33
может хлам шлете и вас выключают?
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
19.04.2013, 10:34
Если recv при первом вызове возвращает 0, то это может означать, что сервер закрыл соединение, ничего не отправив. Приведите весь код.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 11:33  [ТС]
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
int sock;
    bool setting;
    char _message[1024];
    char _temp[1024];
    struct sockaddr_in addr;
    IV_UINT8 buf[2024*1024];
 
    void init(){
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
        wVersionRequested = MAKEWORD(2, 2);
        err = WSAStartup(wVersionRequested, &wsaData);
    }
 
    bool creatSocet(){
        if (sock==-1){
            sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if(sock < 0){
                int num = WSAGetLastError();
                perror("socket");
                sock=-1;
                return false;
            }
            addr.sin_family = AF_INET;
            addr.sin_port = htons(port);
            addr.sin_addr.s_addr = inet_addr(ip);
 
            if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)   {
                perror("connect");
                return false;
            }
        }
        return true;
    }
 
    bool closeSocet(){
        if (sock!=-1){
            //closeS(sock);
            int n = closesocket(sock);
            sock = -1;
            status = false;
            return true;
        }else
            return false;
    }
 
 
    bool connectCam(){
        if (status) return true;
        if (!creatSocet())
            return false;
        if (!formatHttpCam()) return false;
        /*if (closeSocet()){ 
            if (!creatSocet())
                return false;
        }else
            return false;*/
        int n = strlen(_temp);
        if(send(sock, _temp, n, 0)<0){
            perror("send");
            return false;
        }
        status = true;
        return true;
    }
 
    bool formatHttpCam(){
        char _autch[128];
        string _base64, ST1, ST2, respons;
        switch(model){
            case 0:
                strcpy(_message,"GET /axis-cgi/mjpg/video.cgi HTTP/1.1\r\nAuthorization: Basic %s\r\n\r\n");
            break;
            case 1:
                strcpy(_message,"GET / HTTP/1.1\r\n\r\n");
            break;
            case 2:
                strcpy(_message,"GET /cgi-bin/video.cgi?msubmenu=mjpg HTTP/1.0\r\n\r\n");//private/index.html
                char bufer[3048];
                if(send(sock, _message, strlen(_message), 0)<0){
                    perror("send");
                    return false;
                }   
                int sizePoz;
                sizePoz = 0;
                do{
                    sizePoz = recv(sock, (char*)bufer+sizePoz, sizeof(bufer), 0);
                }while(sizePoz>0);              
                int i;
                char *str;
                str = strstr(bufer, "Digest");
                char resBuf[256];
                if (str){
                    str+=7;
                    int i=0;
                    for (i=0; i<strlen(str); ++i)
                        if ((str[i]==13 && str[i+1]==10) || (str[i+1]==13 && str[i]==10))
                            break;
                    strncpy(resBuf, str, i);
                    resBuf[i]=0;
                }else
                    return false;
                char realm[32], nonce[64], qop[16];
                char *token;
                token = strtok( resBuf, ", " );
                while( token != NULL ){
                    char *str;
                    if (str = strstr(token, "realm")){
                        strncpy(realm, str+7, strlen(str)-8);
                        realm[strlen(str)-8]=0;
                    }else if (str = strstr(token, "nonce")){
                        strncpy(nonce, str+7, strlen(str)-8);
                        nonce[strlen(str)-8]=0;
                    }else if (str = strstr(token, "qop")){
                        strncpy(qop, str+5, strlen(str)-6);
                        qop[strlen(str)-6]=0;
                    }
                    token = strtok( NULL, ", " );
                }
                char st1_temp[256], st2_temp[512];
                sprintf(st1_temp,"%s:%s:%s",login, realm, pass);
                ST1 = md5(st1_temp);
                ST2 = md5("GET:/cgi-bin/video.cgi?msubmenu=mjpg");
                sprintf(st2_temp,"%s:%s:%s",ST1.c_str(), nonce, ST2.c_str());
                respons = md5(st2_temp);
                sprintf(_message,"GET /cgi-bin/video.cgi?msubmenu=mjpg HTTP/1.0\r\nAuthorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"/cgi-bin/video.cgi?msubmenu=mjpg\", qop=\"%s\", response=\"%s\"\r\n\r\n", login, realm, nonce, qop, respons.c_str());
                //strcpy(_message,"GET /index.php HTTP/1.1\r\n\r\n");
            break;
            default:
                return false;
            break;
        }
        sprintf(_autch,"%s:%s",login, pass);
        _base64 = base64_encode((const unsigned char*)_autch, strlen(_autch));
        sprintf(_temp,_message,_base64.c_str());
        return true;
    }
 
    void stup(char *_ip, int _port, char *_login, char *_pass, int _model=0){
        strcpy(ip, _ip);
        if (_login != NULL)
            strcpy(login, _login);
        if (_pass != NULL)
            strcpy(pass, _pass);
        model = _model;
        port = _port;
        sock = -1;
        setting=true;
        status = false;
    }
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.04.2013, 11:37
и чо?
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
19.04.2013, 12:32
1. Убедитесь что recv действительно возвращает 0 при первом вызове.
2. В программе существуют стандартные ошибки, такие как
C
1
str = strstr(bufer, "Digest");
При том, что bufer не является строкой с 0 на конце.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 13:16  [ТС]
Цитата Сообщение от dmitry94 Посмотреть сообщение
1. Убедитесь что recv действительно возвращает 0 при первом вызове.
2. В программе существуют стандартные ошибки, такие как
C
1
str = strstr(bufer, "Digest");
При том, что bufer не является строкой с 0 на конце.
Для таких вещей дальше идет проверка:
C++
1
2
3
4
if (str){
...
}else
return false;
И при первой посылке все приходит нормально!!! а вот при второй отправке нечего уже не приходит.

Добавлено через 3 минуты
Кароче ребят скажите пожалуйста при каждой отправки пакетов на HTTP сервер, надо постоянно переподключатся? т.е. закрывать сокет и заного открывать и конектится?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.04.2013, 13:30
Цитата Сообщение от NiceMx Посмотреть сообщение
при каждой отправки пакетов на HTTP сервер, надо постоянно переподключатся?
по идее - только если в сообщении стоит "Connection: Close". если ничего не стоит - не факт что сервер поймет это как "Connection: Keep-Alive". попробуйте передать с сообщением "Connection: Keep-Alive"
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
19.04.2013, 13:47
По умолчанию для HTTP 1.1. Connection: keep-alive, к тому же в HTTP 1.1. в запросе обязательно указывать Host:
NiceMx Думаю в вашем случае скорее всего в этом проблема, реализовывать механизм keep-alive в вашем случае нет смысла. Отправляйте запросы по HTTP 1.0., закрывайте соединение после каждого ответа сервера и снова подключайтесь.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 14:00  [ТС]
Пробовал делать следующий заголовки:
Первый запрос:
C++
1
strcpy(_message,"GET /private/index.html HTTP/1.1\r\nHost: 192.168.1.132:80\r\nConnection: Keep-Alive\r\n\r\n");//cgi-bin/video.cgi?msubmenu=mjpg
Второй запрос:
C++
1
sprintf(_message,"GET /private/index.html HTTP/1.1\r\nHost: 192.168.1.132:80\r\nConnection: Keep-Alive\r\nAuthorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"/private/index.html\", qop=\"%s\", nc=\"%s\", cnonce=\"%s\", response=\"%s\"\r\n\r\n", login, realm, nonce, qop, nc, cnonce, respons.c_str());
Результат тот соединение закрывается, и второй запрос не отправляется.
Передергивать коннект мне не нравится, но в этом случаи он работает.
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
19.04.2013, 14:12
Сервер не обязан поддерживать keep-alive для каждого запроса. Нужно анализировать ответ сервера. Еще раз повторюсь, в вашем случае проще использовать HTTP 1.0., либо прописывать Connection: close в заголовке и закрывать-открывать соединение при каждом запросе - все будет работать.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 14:14  [ТС]
Я понял что вы мне сказали, но сервер мне отвечает что все ок:
HTTP/1.1 401 Authorization Required
Date: Fri, 19 Apr 2013 10:13:57 GMT
Server: Apache/2.2.8 (Win32) PHP/5.4.8
WWW-Authenticate: Digest realm="private", nonce="rygi+rPaBAA=f02422a6eed2df043a8b9 58cc652f505a447999d", algorithm=MD5, qop="auth"
Content-Length: 488
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUB....
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.04.2013, 14:18
а когда он вам такое отвечает? тут написано что он не принял вашу авторизацию
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
19.04.2013, 14:24
Цитата Сообщение от NiceMx Посмотреть сообщение
Я понял что вы мне сказали, но сервер мне отвечает что все ок:
Вам нужно знать когда закончить чтение, так как закончить чтение по закрытию сокета в случае keep-alive нельзя, ибо сервер его не закрывает. Нужно анализировать все поля ответа, content-length. А если будет передача будет закодирована transfer-encoding: chunked, то код усложнится еще на порядок.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 14:26  [ТС]
Это в первый раз он мне так отвечает. Да он не допускает меня но возвращает мне данные для авторизации которые потом я обрабатываю и формирую второй запрос. И вот кокраз 2 запрос не отправляется!

Добавлено через 2 минуты
У меня ограниченное подключение и я знаю точно что должео прийти. Читаю я все до последнего байта. У меня стоит цикол пока все не считаю.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
19.04.2013, 16:12
Цитата Сообщение от NiceMx Посмотреть сообщение
И вот кокраз 2 запрос не отправляется!
Вам уже несколько человек сказали...
в коде условие выхода из recv() цикла - закрытый сокет или ошибка. И если хочется использовать keep-alive, то анализируйте заголовки.
1
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 10
19.04.2013, 17:21  [ТС]
Хорошо. Вы хотите сказать что лишний раз нельзя вызывать recv()! Или что, не пойму ошибки я анализирую негде ошибок не возникает. Почему все таки закрывается соединение!?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
19.04.2013, 17:49
Цитата Сообщение от NiceMx Посмотреть сообщение
Вы хотите сказать что лишний раз нельзя вызывать recv()
Да. Если на пальцах, то вы делаете recv(), смотрите а пришел ли заголовок полностью "\r\n\r\n", если пришел, ищите в нем content-length и читаете сколько там сказано. После можно посылать следующий запрос.
Цитата Сообщение от NiceMx Посмотреть сообщение
не пойму ошибки я анализирую негде ошибок не возникает. Почему все таки закрывается соединение!?
Прочитайте описание recv(), подумайте что значит Ваше:

Цитата Сообщение от NiceMx Посмотреть сообщение
do{
* * * * * * * * * * sizePoz = recv(sock, (char*)bufer+sizePoz, sizeof(bufer), 0);
* * * * * * * * }while(sizePoz>0);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2013, 17:49
Помогаю со студенческими работами здесь

Не отправляет данные формы
Доброго времени суток. Проблема в том что данные с формы отправляются на почту но уведомление после отправки не происходит(( &lt;? ...

Не отправляет данные из textbox
Есть код: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

Не отправляет данные в таблицу
Отправляется в базу данных ,всё , кроме qty,Name, s_name, address,post_index, email, а например id,product,prod_id и price отправляет...

Форма не отправляет данные
Здравствуйте! Не так давно начал изучать пхп, сейчас пишу свой блог. Вот решил сделать возможность комментировать записи в блоге.Но...

Ajax не отправляет данные
Ранее, ниже указанный код работал без проблем, но в один момент, что-то ему начало мешать :( Ошибка заключается в том что, при вводе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru