0

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

编辑:在发送数据包的 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];
}
}
4

1 回答 1

1

sendto的文档指出:

如果没有发生错误,sendto 返回发送的总字节数,可以小于 len 指示的数字。否则,返回 SOCKET_ERROR 的值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

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

于 2013-04-28T23:05:53.963 回答