微软的sendto和recvfrom都怎么么,疯了?

来源:互联网  时间:2016/8/3 3:30:13

关于网友提出的“ 微软的sendto和recvfrom都怎么么,疯了?”问题疑问,本网通过在网上对“ 微软的sendto和recvfrom都怎么么,疯了?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 微软的sendto和recvfrom都怎么么,疯了?
描述:

WSADATA oWSADATA;
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup(wVersionRequested, &oWSADATA);
SOCKET m_hSock = socket(AF_INET, SOCK_DGRAM, 0);
if(m_hSock == INVALID_SOCKET)
return 1;
sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(30000);
local.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(m_hSock, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
{
closesocket(m_hSock);
m_hSock = INVALID_SOCKET;
return 1;
}
char sHostName[256];
gethostname(sHostName, 256);
sockaddr_in to; 
memset(&to, 0, sizeof(sockaddr_in)); 
to.sin_family = AF_INET; 
to.sin_port = htons(30001); 
to.sin_addr.s_addr = *(unsigned int*)(gethostbyname(sHostName)->h_addr_list[0]);
/*
使用本机IP,可以用inet_addr("127.0.0.1")来代替。
*/
char pbuf[1024]; 
strcpy(pbuf, "123"); 
nRet = sendto(m_hSock, pbuf, 1024, 0, (const struct sockaddr *)&to, sizeof(to));
/*
往30001端口发送1024字节的数据,但是没有启动30001端口的UDP Server程序。
sendto函数依然能够将返回1024。----- 这是合理的。
*/
sockaddr_in oFrom;
memset(&oFrom, 0, sizeof(sockaddr_in));
int nFromLen = sizeof(oFrom);
nRet = recvfrom(m_hSock, pbuf, 1024, 0, (struct sockaddr *)&oFrom, &nFromLen); 
/*
(1)奇怪的是recvfrom返回-1,如果调用GetLastError将返回10054,表示"远程主机强迫关闭了现有的一个连接"。
奇怪,这明明是UDP,何来连接
(2)如果不调用sendto函数,该函数将阻赛在这里,不返回。---- 这是合理的
(3)如果启动启动30001端口的UDP Server程序,也不会有什么问题。如果UDP Server收到消息什么都不作
该recvfrom将阻塞在这里,如果UDP Server沿原路返回消息,该recvfrom将收到UDP Server发回的消息。---- 这是合理的
(4)如果sendto的目的地址不是127.0.0.1或者本机的任何IP, recvfrom将阻赛在这里,不返回。---- 这是合理的
(5)唯独奇怪的是先向本机某端口发送一个包,并且该端口上没有UDP的接收程序的话,recvfrom就会发疯了。
*/
closesocket(m_hSock);
WSACleanup();

上一篇做网管软件的前途市场如何?
下一篇VC实现网络登录
明星图片
相关文章
《 微软的sendto和recvfrom都怎么么,疯了?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)