SOCKET m_sock;
//deTime INFINITE为无限等待
VOID SetTimeOut(DWORD deTime)
{
DWORD optval;
if(deTime)
{
optval=0;
ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);

if(INFINITE==deTime)
optval=0;
else
optval=deTime; setsockopt(m_sock,SOL_SOCKET, SO_RCVTIMEO, (char *)&optval, sizeof(int));
DWORD error=GetLastError();

}
else
{
optval=1;
ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);
}
}void CTestudpDlg::OnOK() 
{
// TODO: Add extra validation here
WSADATA wsaData;
SOCKADDR_IN from,to;
WORD version = MAKEWORD(2, 0);
int ret = WSAStartup(version, &wsaData);
if(ret != 0)
{
return ;
} m_sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (m_sock == INVALID_SOCKET)
    {        
        return ;
    } SOCKADDR_IN     sa_udp;
memset(&sa_udp,0,sizeof(SOCKADDR_IN)); sa_udp.sin_family = AF_INET;
sa_udp.sin_port = htons(80);
     ret = bind(m_sock, (SOCKADDR *)&sa_udp, sizeof (SOCKADDR_IN));
    if (ret == SOCKET_ERROR)
    {
DWORD error=GetLastError();
return ;
    } memset(&to,0,sizeof (SOCKADDR_IN));
to.sin_family=AF_INET;
to.sin_port=htons(80);
hostent* pEnt = NULL;
pEnt = ::gethostbyname("www.xxx.net");   //这里是在Internet上的服务器的域名
if(!pEnt)
{
return ;
} to.sin_addr.S_un.S_un_b.s_b1 = pEnt->h_addr_list[0][0];
to.sin_addr.S_un.S_un_b.s_b2 = pEnt->h_addr_list[0][1];
to.sin_addr.S_un.S_un_b.s_b3 = pEnt->h_addr_list[0][2];
to.sin_addr.S_un.S_un_b.s_b4 = pEnt->h_addr_list[0][3];

BYTE buf[180];   //需要发送的数据的缓冲
int length=180;
*(WORD*)buf=41637;  //命令
ret=sendto(m_sock, (char*)buf, length, 0, (SOCKADDR*)&to, sizeof(SOCKADDR_IN));
if(ret == SOCKET_ERROR)
{
return ;
} SetTimeOut(6000);
int addlen=sizeof(SOCKADDR_IN);
memset((BYTE*)&from,0,addlen);
ret = recvfrom(m_sock,(char*)buf,length,0,(SOCKADDR *)&from,&addlen);
if(ret == SOCKET_ERROR)
{
//在用户那里.此处返回10060错误...
//在我自己局域网的机器,是不会返回错误的.
CString temp;
temp.Format("Receive data error %d!",GetLastError());   
        AfxMessageBox(temp);
return;
}
CDialog::OnOK();
}

解决方案 »

  1.   

    兄弟,大放血啊。估计不是你代码的问题啊。
    是否那个单位防火墙屏蔽了所有UDP数据包呢?
      

  2.   

    那么,做一个在80端口上的TCP连接,可能可以解决问题???
    因为80端口的TCP应该不会被封.(我想用户不打开浏览器的情况下,在80端口上建立TCP连接可以的吧)
    现在只要能让用户连上我们的服务器就行.
      

  3.   

    如果封锁了UDP数据包,那么该公司的网管应该是知道的啊。问一下不就行了么
      

  4.   

    10060 A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
      

  5.   

    你的套接字是锁定模式,设置了SO_RCVTIMEO选项,在一段时间内没有数据抵达,调将失败反回10060
    要解决这个一问题你可以尝试将套接字改为非锁定模式或去掉SO_RCVTIMEO和SO_SENDTIMEO选项.
      

  6.   

    没有回应,我觉得如果去掉SO_RCVTIMEO和SO_SENDTIMEO选项.双方都会无限的等,如果对方有防火墙或者把端口封掉的话,楼主的程序会不会死掉呢?楼主试试,然后给个回复,我们也跟着学习一下
      

  7.   

    其实这个问题的关键应该是如何处理用户那里有防火墙的情况.
    我现在正在测试,看究竟是不是因为防火墙,如果只是因为防火墙那还好办,如果不是,我就不知道原因在哪里了。
    应该不是SO_RCVTIMEO的问题,因为就是在国外,他们也能联上我们的服务器。
      

  8.   

    你这不是要两边都按了OK才开始工作啊?
    能保证两边差不多同时按下去吗?
    只有6000ms的间隔?
      

  9.   

    前几天我发了几个100分的贴,主要关于防火墙拦截我数据包的问题,
    经过确认,确实是用户那里有防火墙,但因为用户无法让网管修改规则,所以我要另找途径解决问题。今天又遇一奇怪问题。如下:
    我了解到用户使用了贸易通软件,并且发了一个端口监测工具给他,知道贸易通使用了8080的TCP端口,
    于是我写了一个使用8080端口的测试程序
    我在我们的服务器上放了server.exe在8080端口等待tcp/ip连接。
    在用户那里让他用client.exe连接8080端口,但无法连接,我在其它地方测试,却都可以。
    而且让用户使用telnet www.xxx.com 8080 ,返回:无法打开主机的连接 在端口23:连接失败
    大家分析一下什么原因???
    我注意到用户的机器上运行了
    AliTalk.exe 436 172.23.222.58 1490 172.16.0.4 8080 ESTABLISHED TCP D:\阿里巴巴\贸易通\AliTalk.exeThunder.exe 1456 127.0.0.1 1055 LISTEN UDP D:\新建文件夹\Thunder.exe
    Thunder.exe 1456 172.23.222.58 1052 LISTEN UDP D:\新建文件夹\Thunder.exe
    Thunder.exe 1456 0.0.0.0 3077 LISTEN TCP D:\新建文件夹\Thunder.exe会不会这个Thunder.exe在搞鬼?