c++ - Win32 C++ sendto() 返回错误 8 : WSA_NOT_ENOUGH_MEMORY

标签 c++ winapi network-programming udp

我有一个程序可以检测我计算机上的键盘输入并通过 UDP 将它们发送到我的 Android 手机。然后 Android 手机获取 UDP 数据包并将每个按键命中记录在文本文件中,但这不是重点。我目前正在使用标准的 Win32 API,以便通过 sendto() 函数和 WSAStartup 发送数据包。然而,突然间 sendto() 一直返回错误 8,根据 MSDN,这意味着 WSA_NOT_ENOUGH_MEMORY。现在我知道这意味着什么,但我不明白如何更改我的程序来修复它,考虑到我什么也没做,它才开始这样做。重新启动我的电脑没有帮助。下面是 UDP 数据包发送函数的样子。也许你们可以帮助我。请注意,这是一个线程函数。按照程序员的说法,线程不是专用一定量的内存吗?这可能是问题所在吗?

编辑:这个错误是在发送数据包的 PC 上收到的,而不是手机。 Wireshark 不会拾取离开 PC 的包装,即使它在出现此错误之前工作正常。

谢谢,

DWORD msgSender(LPVOID arg)
{
//Setup
size_t pkt_length = PACKET_LENGTH;
char pkt[PACKET_LENGTH];
sockaddr_in dest;
sockaddr_in local;
char inputAddr[] = "127.0.0.1";
char destAddr[] = "192.168.1.7";
WSACleanup();
WSADATA WsaData;
WSAStartup(MAKEWORD(2,2), &WsaData);

local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr(inputAddr);
local.sin_port = 8081; // choose any

dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(destAddr);
dest.sin_port = htons(8080);

// create the socket
s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
// bind to the local address
bind( s, (sockaddr *)&local, sizeof(local) );

while(true)
{
        WaitForSingleObject(msgEvent, INFINITE);
        copyToPacket(keyStr, pkt);
        int ret = sendto( s, pkt, pkt_length, 0, (sockaddr*)&dest, sizeof(dest));
        keyReceived = false;
}
return 1;
}

void copyToPacket(string str, char* packet)
{
for(int i = 0; i < str.length() && i < PACKET_LENGTH; i++)
{
    packet[i] = str[i];
}
}

最佳答案

sendto 的文档指出:

If no error occurs, sendto returns the total number of bytes sent, which can be less than the number indicated by len. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

根据您的描述,Windows 机器似乎成功发送了 8 个字节。

关于c++ - Win32 C++ sendto() 返回错误 8 : WSA_NOT_ENOUGH_MEMORY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268851/

相关文章:

networking - hadoop中主机名到IP冲突

c - recv()对于大量数据不起作用

java - android中的WiFi网络编程

c++ - boost asio ssl async_shutdown总是以错误结束?

c++ - 按钮按下处理 win32 c++

c++ - 使用模板元编程将模板函数 bool 参数转置为运行时函数参数

c# - 获取正在运行的应用程序的屏幕

C++ 将全局列表传递给线程

c++ - 是否可以在 C++11 中编写宏 existenceof(S,f) 或 hasfield(S,f)?

c++ - <time.h>/<ctime> 不计算滴答