Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Мотороллер
432 / 243 / 43
Регистрация: 05.08.2013
Сообщений: 1,666
Завершенные тесты: 1
1

WSA recv не читает все сообщение

02.01.2017, 17:08. Просмотров 364. Ответов 3
Метки нет (Все метки)

алгоритм таков:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
invoke WSAStartup, 0x0202, wsa
invoke  socket,AF_INET,SOCK_STREAM,NULL
.....
invoke  bind, dword [hSocket], sock_addr,sizeof.sockaddr_in
.........
invoke listen, dword [hSocket],200
...........
.while dword [next_loop]=1
       invoke accept, dword [hSocket], 0, 0
       mov [hClient], eax
       .if eax > 0
               invoke recv, eax, buffer, 500, 0
               invoke send, dword [hClient], toSend, toSendLen, 0
               invoke closesocket, dword [hClient]
        .endif
 
.endw
собственно подключаюсь телнетом, жму любую клавишу и софтина сразу шлет ответ. хотя по идее должна читать 500 символов. что я делаю не так?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 17:08
Ответы с готовыми решениями:

Как функция recv() читает UDP-пакеты?
отправленный пакет с udp клиента ( при помощи функции send()) читается на сервере за один раз (при...

recv - постоянно возвращает -1 (на c под api) все работало
recv - постоянно возвращает -1 (на c под api) все работало. пытаюсь переписать код под дельфи с...

Странное поведение WSA send
bool wsaSendRequest(String serverAddr, unsigned int port, String data) { WSADATA wsaData; WORD...

ЦАП читает не все сэмплы
Имеется необходимость вывести через ЦАП сигнал, который записан в массив. Частота вывода должна...

Привод ноутбука не все читает
добрый день имею дисковод sony optiars не пойму стоит ли купить другой или с этим разобраться...

3
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
02.01.2017, 17:29 2
Цитата Сообщение от Мотороллер Посмотреть сообщение
по идее должна читать 500 символов
вернее должна читать максимум 500 символов, а вообще приходить может и по 1 символу(теоретически). так что если нужно принять 500 - принимай в цикле до того как прочел 500. а уж потом invoke send
2
Мотороллер
432 / 243 / 43
Регистрация: 05.08.2013
Сообщений: 1,666
Завершенные тесты: 1
02.01.2017, 19:03  [ТС] 3
а я думал это костыль... Однако интересно: ставлю брейк на 10 строку, конекчусь телнетом, бряк срабатывает, пишу овердлинную строку, далее по F8 трассирую - все сообщение приходит за раз!

Добавлено через 1 час 18 минут
еще вопрос: переделал на цикл с recv
Assembler
1
2
3
4
5
6
7
8
xor ecx, ecx
                  .repeat
                        lea esi, [buffer + ecx]
                        push ecx
                        invoke recv, [hClient], esi, 1, 0
                        pop ecx
                        inc ecx
                  .until eax = 0 | ecx > BUFF_LEN
и написал простую подобную софтину, которая подключается и шлет. сообщение.
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
#include "stdafx.h"
#include<stdio.h>
#include<winsock2.h>
 
#pragma comment(lib,"ws2_32.lib") //Winsock Library
 
int main(int argc , char *argv[])
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message , server_reply[2000];
    int recv_size;
 
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }
     
    printf("Initialised.\n");
     
    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }
 
    printf("Socket created.\n");
     
     
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 33333 );
 
    //Connect to remote server
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }
     
    puts("Connected");
     
    //Send some data
    message = "GET / HTTP/1.1\r\n\r\n";
    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    puts("Data Send\n");
     
    //Receive a reply from the server
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }
     
    puts("Reply received\n");
 
    //Add a NULL terminating character to make it a proper string before printing
    server_reply[recv_size] = '\0';
    puts(server_reply);
    getchar();
    return 0;
}
после 53 строки выполнение останавливается, а на "сервере" recv не возвращает ноль до тех пор, пока я не закрою клиент. ВТФ?
0
murderer
4299 / 1562 / 157
Регистрация: 06.10.2010
Сообщений: 3,457
08.01.2017, 16:22 4
Ну если перед recv на сервере добавить пустое сообщение, что-то вроде:
C++
1
send(s , 0 , 0 , 0)
Твой цикл должен нормально отработать
1
08.01.2017, 16:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 16:22

DVD-RW привод читает не все диски
Добрый день! DVD-RW привод читает заводские диски(диски с играми,системой,ПО) и пустые DVD-RW....

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru