c++ - UDP Tx 循环每次在正好 3970 个数据包时停止工作,在我 friend 的计算机上为 14386

标签 c++ c sockets udp packets

在过去的 4 天里,我一直被这个问题困住,我似乎无法弄清楚。我正在尝试使用 UDP 数据包向自己发送数据,以便另一个程序可以读取字节。

我可以清楚地读取数据包,但在程序的 UDP 部分挂起之前我只能读取到 3970。过剩和其他一切继续正常运行。我给了我的 friend 同样的代码,他在他的电脑上运行了它。在挂起之前,他进行了 14386 次迭代。变量 temp 将计算发送的数据包数。 -1 不好。 counter 计算 while 循环迭代次数。我在这里遵循示例:

http://msdn.microsoft.com/en-us/library/ms740148(v=vs.85).aspx

示例代码:

#include "stdafx.h"
#include <WinSock2.h> // don't forget to add in 
//Project Properties>Linker>Input>Additional Dependences [Ws2_32.lib]
sockaddr_in dest;
sockaddr_in local;
WSAData data;
static void SUDP_init(void)
{
    printf("--[UDP Socket Initialized]--\r\n");
    WSAStartup( MAKEWORD( 2, 2 ), &data );

    local.sin_family = AF_INET;
    local.sin_addr.s_addr = inet_addr( "127.0.0.1" ); //same as localhost
    local.sin_port = 6000;

    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    dest.sin_port = htons( 6000 );

    bind( socket( AF_INET, SOCK_DGRAM, 0 ), (sockaddr *)&local, sizeof(local) );
    printf("Socket Bound...\r\n");
}
static int counter = 0;
int _tmain(int argc, _TCHAR* argv[])
{
    SUDP_init();
    while(1){
        char packet[30];
        sprintf(packet, "%0.3f,%0.3f,%0.3f", 
        55.4,
        16.1,
        -27.88);

        int temp = sendto( socket( AF_INET, SOCK_DGRAM, 0 ), packet, strlen(packet), 0, (sockaddr *)&dest, sizeof(dest) );
        if(temp>=1){
            counter++;
        }
        printf("Bytes Sent: %d, Counter: %d\r\n",temp,counter);
    }
    return 0;
}       

最佳答案

您正在循环中分配新的套接字(sendto 的第一个参数),您还为 bind 分配另一个套接字,但这些套接字永远不会被释放。您最终会用完要分配的套接字句柄,因此您的程序会挂起。

相反,在 SUDP_init 中分配一个套接字,存储它而不是丢弃它,然后将其传递给 bindsendto

关于c++ - UDP Tx 循环每次在正好 3970 个数据包时停止工作,在我 friend 的计算机上为 14386,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6556113/

相关文章:

c++ - 如何重置 chrono::duration 值?

sockets - Boost ASIO 丢弃 UDP 数据包

c++ - 针对不同的子类值调用 Main 上的排序

c++ - 向量化对称矩阵

C++ stringstream 字符串转函数(test, char *test2)

c - 为什么我的 free() 包装函数不起作用?

c - (size_t)-1 和 ~0 之间有什么区别?

c - 为什么在 C 的头文件中使用 typedef struct?

r - 如何连接到 R 语言的 Unix 域(AF_UNIX)套接字?

c - 通过 socket tcp 发送一个带有空格的字符串