我有一个程序可以检测我计算机上的键盘输入并通过 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/