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

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

18.04.2013, 17:57. Показов 3056. Ответов 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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru