以glib(mm)监视UDP套接字会占用CPU时间

时间:2010-06-15 12:08:43

标签: windows udp glib gtkmm

我有一个GTKmm Windows应用程序(使用MinGW构建),它接收UDP数据包(不发送)。套接字是本机winsock,我使用glibmm IOChannel将它连接到应用程序主循环。使用recvfrom读取套接字。

我的问题是:这个设置在3GHz工作站上占用了25%的CPU时间。有人可以告诉我为什么吗?

在这种情况下,应用程序处于空闲状态,如果删除UDP代码,CPU使用率将降至几乎为零。由于应用程序必须执行一些CPU密集型任务,我可以想象更好的方式来花费25%

以下是一些代码摘录:(抱歉printf的;))


/* bind */
void UDPInterface::bindToPort(unsigned short port)
{
    struct sockaddr_in target;
    WSADATA wsaData;

    target.sin_family = AF_INET;
    target.sin_port = htons(port);
    target.sin_addr.s_addr = 0;

    if ( WSAStartup ( 0x0202, &wsaData ) )
    {
        printf("WSAStartup failed!\n");
        exit(0); // :)
        WSACleanup();
    }

    sock = socket( AF_INET, SOCK_DGRAM, 0 );
    if (sock == INVALID_SOCKET)
    {
        printf("invalid socket!\n");
        exit(0);
    }

    if (bind(sock,(struct sockaddr*) &target, sizeof(struct sockaddr_in) ) == SOCKET_ERROR)
    {
        printf("failed to bind to port!\n");
        exit(0);
    }

    printf("[UDPInterface::bindToPort] listening on port %i\n", port);
}

/* read */
bool UDPInterface::UDPEvent(Glib::IOCondition io_condition)
{
    recvfrom(sock, (char*)buf, BUF_SIZE*4, 0, NULL, NULL);
    /* process packet... */
}

/* glibmm connect */
Glib::RefPtr channel = Glib::IOChannel::create_from_win32_socket(udp.sock);
Glib::signal_io().connect( sigc::mem_fun(udp, &UDPInterface::UDPEvent), channel, Glib::IO_IN );

我在其他一些问题中已经阅读过,而且在glib文档(g_io_channel_win32_new_socket())中,套接字被置于非阻塞模式,这是“实现的副作用并且是不可避免的”。这是否解释了CPU效应,我不清楚这一点?

我是否使用glib来访问套接字或直接调用recvfrom()似乎没有太大区别,因为CPU在任何数据包到达之前就已用完并且读取处理程序被调用。另外glibmm文档声明即使套接字被轮询也可以调用recvfrom()(Glib :: IOChannel :: create_from_win32_socket())

我尝试使用-pg编译程序并使用gprof创建了每个函数的cpu使用情况报告。这没用,因为我的程序没有花时间,但是在一些外部glib / glibmm dll中。

0 个答案:

没有答案