gpt4 book ai didi

C++ Winsock接收数据会卡死

转载 作者:行者123 更新时间:2023-11-28 08:07:57 25 4
gpt4 key购买 nike

我正在用 C++ 中的 Code::Blocks 制作一个程序,以使用 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);
}

最佳答案

它卡住是因为它正在等待数据。如果您不想等待数据,请不要进行那样的 Winsock 调用。使用 Windows 上可用的众多非阻塞 I/O 方法之一,例如 Async operations , I/O completion ports或完成事件。

顺便说一下,您的代码在很多方面似乎都存在严重问题。它似乎缺少协议(protocol)。如果不在 TCP 之上设计和实现协议(protocol),就无法使用 TCP。如果您不处理通过某种重建传输信息的协议(protocol)引擎接收到的数据,您将获得完全不可靠的行为。例如,在您的情况下,如果有人发送“foo”,最终文本将取决于数据如何组装以进行传输。它可能是“foo”,但也可能是“o”,因为“fo”可以被覆盖。

如果另一方正在发送,如您所说,您需要将此端编码为接收行。也就是说,您需要继续接收数据,直到您有一条线路,并且不要让后来的接收覆盖较早的接收,以便您可以重新组装传输的线路。您粘贴的代码中完全缺少实际实现接收行的代码。 (例如,如果“行”被定义为由换行符终止的一堆字节,则需要有代码来搜索换行符并将它们之前的所有内容组合到一个缓冲区中进行处理。)

关于C++ Winsock接收数据会卡死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com