关于网友提出的“ 微软的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();