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();
}
//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();
}
解决方案 »
- VC++ Single Document 中动态创建的CStatic控件如何响应鼠标左键单击?
- 怎么根据宏值取得宏的变量名?
- 请教TCHAR数组的赋值问题!!!
- Vc++中常见错误请教 谢谢
- 简单问题,如何改变sdk窗口的背景颜色。
- 如何连接两个BSTR
- 有人装过Windows SDK吗,安装的那么多,都是什么东西??
- 有没有这样的一个win32API函数?
- 多文档嵌入Chrome CEF求教
- 为什么在对话框程序的PreTranslateMessage里面显示一个模态对话框会出错?关注!!!
- 在线等,200分,关于10060问题的解决,绝不食言.
- WNDCLASS类中的lpszClassName是什么作用?
是否那个单位防火墙屏蔽了所有UDP数据包呢?
因为80端口的TCP应该不会被封.(我想用户不打开浏览器的情况下,在80端口上建立TCP连接可以的吧)
现在只要能让用户连上我们的服务器就行.
要解决这个一问题你可以尝试将套接字改为非锁定模式或去掉SO_RCVTIMEO和SO_SENDTIMEO选项.
我现在正在测试,看究竟是不是因为防火墙,如果只是因为防火墙那还好办,如果不是,我就不知道原因在哪里了。
应该不是SO_RCVTIMEO的问题,因为就是在国外,他们也能联上我们的服务器。
能保证两边差不多同时按下去吗?
只有6000ms的间隔?
经过确认,确实是用户那里有防火墙,但因为用户无法让网管修改规则,所以我要另找途径解决问题。今天又遇一奇怪问题。如下:
我了解到用户使用了贸易通软件,并且发了一个端口监测工具给他,知道贸易通使用了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在搞鬼?