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

时间:2013-04-28 22:47:12

标签: 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];
}
}

1 个答案:

答案 0 :(得分:1)

sendto的文档指出:

  

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

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