|
楼主 |
发表于 2009-4-7 15:47:45
|
显示全部楼层
终于发现问题所在!
问题出在int init_as_client_bindip(const char *szIP); // 作为UDP客户端绑定IP
这个函数在前摄器模式下工作OK,到linux epoll模式下,绑定端口后,再进行注册“读事件”会失败。
int MyConnection::init_as_client_bindip(const char *szIP)
{
// Create a UDP socket to transfer datagrams.
ACE_SOCK_Dgram sock;
ACE_INET_Addr ace_addr;
sockaddr_in sockaddr;
ACE_UINT16 localPort = 32500;
do
{
memset(&sockaddr, 0, sizeof(sockaddr_in));
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(localPort++);
sockaddr.sin_addr.s_addr = inet_addr(szIP);
ACE_INET_Addr ace_addr_temp(&sockaddr, sizeof(sockaddr_in));
ace_addr = ace_addr_temp;
if (localPort-32500>100)
{
ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open udp socket failed"), -1);
return -1;
}
}
while (m_dgram.open(ace_addr, ACE_PROTOCOL_FAMILY_INET, 0, 1) == -1);
printf.StatusOut("Bind local UDP socket at port %d.", localPort-1);
return 0;
}
换成下面的函数,程序就OK了(上面的绑定本地IP和端口的函数在前摄器模式下工作OK)
int MyConnection::init_as_client ()
{
// Create a UDP socket to transfer datagrams.
if (m_dgram.open (ACE_INET_Addr::sap_any) == -1)
ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open udp socket failed"), -1);
return 0;
} |
|