C ++ Winsock заморозит получение данных - PullRequest
0 голосов
/ 25 марта 2012

Я делаю программу с Code :: Blocks на C ++ Для отправки и получения данных с помощью Winsocks, но когда я пытаюсь получить данные, моя программа зависает, пожалуйста, помогите. Не знаю почему? Мне удалось получить только 1 строку без использования цикла, поэтому я добавил цикл, чтобы увидеть, смогу ли я получить больше строк, которые появляются, и теперь он просто зависает.

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include "resource.h"
#include <winsock.h>

using namespace std;

SOCKET mysocket;
SOCKADDR_IN SockAddr;
char buf1[120];
char buf2[120];
char ReadIp[120];
int UsePort;
int n;

HINSTANCE hInst;

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            WSADATA WsaDat;
            WSAStartup(MAKEWORD(1,1), &WsaDat);
            mysocket = socket(AF_INET, SOCK_STREAM, 0);
            return TRUE;

        case WM_CLOSE:
            EndDialog(hwndDlg, 0);
            return TRUE;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_BTN_QUIT:
                    EndDialog(hwndDlg, 0);
                    return TRUE;

                case BtnSend:
                    GetDlgItemText(hwndDlg, PacketText, buf2, sizeof(buf2));
                    send(mysocket, buf2, sizeof(buf2), 0);
                    return TRUE;

                case IDC_BTN_TEST:
                    UsePort = GetDlgItemInt(hwndDlg, PortText, NULL, FALSE);
                    GetDlgItemText(hwndDlg, IpText, ReadIp, sizeof(ReadIp));
                    SockAddr.sin_port = htons(UsePort);
                    SockAddr.sin_addr.s_addr=inet_addr(ReadIp);
                    SockAddr.sin_family = AF_INET;
                    connect(mysocket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr));
                    do {
                        n = recv(mysocket, buf1, sizeof(buf1), 0);
                    if (n > 0)
                        SetDlgItemText(hwndDlg, List1, buf1);
                    } while (n > 0);
                    return TRUE;
                    }
    }

    return FALSE;
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hInst = hInstance;

    // The user interface is a modal dialog box
    return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
}

1 Ответ

1 голос
/ 25 марта 2012

Он зависает, потому что ждет данных. Если вы не хотите ждать данных, не звоните Winsock, который это делает. Используйте один из многих неблокирующих методов ввода-вывода, доступных в Windows, таких как Асинхронные операции , Порты завершения ввода-вывода или события завершения.

Между прочим, ваш код кажется сильно сломанным во многих отношениях. Кажется, отсутствует протокол . Вы не можете использовать TCP без разработки и реализации протокола поверх TCP. Вы получите совершенно ненадежное поведение, если не обработаете данные, полученные с помощью какого-либо механизма протоколов, который восстанавливает передаваемую информацию. Например, в вашем случае, если кто-то отправит «foo», окончательный текст будет зависеть от того, как данные были собраны для транспортировки. Это может быть «foo», но это может быть «o», поскольку «fo» может быть перезаписано.

Если другая сторона отправляет строк , как вы утверждаете, вам необходимо закодировать этот конец для приема строк. Таким образом, вам нужно продолжать получать данные до тех пор, пока у вас не будет строки, и не позволять перезаписывать более поздние сообщения ранее полученными, чтобы вы могли повторно собрать переданную линию. Код, который фактически реализует получение строк, полностью отсутствует в вставленном вами коде. (Если, например, «строка» определяется как набор байтов, оканчивающихся символом новой строки, необходимо найти код для поиска символов новой строки и собрать все перед ними в единый буфер для обработки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...