udp winsock编程
我是socket编程的初学者。我想从端口连续接收udp数据包。为此,我创建了socket,并使用我在程序中完成的bind和recv调用。在缓冲区中,我存储udp数据包。如何逐包接收。如何设置特定时间间隔的条件?提前谢谢udp winsock编程,udp,winsock,Udp,Winsock,我是socket编程的初学者。我想从端口连续接收udp数据包。为此,我创建了socket,并使用我在程序中完成的bind和recv调用。在缓冲区中,我存储udp数据包。如何逐包接收。如何设置特定时间间隔的条件?提前谢谢 static int recvData = 1; sockID = socket(AF_INET, SOCK_DGRAM, 0); if(sockID < 0) { printf("Socket creation error\n"); WSAClea
static int recvData = 1;
sockID = socket(AF_INET, SOCK_DGRAM, 0);
if(sockID < 0)
{
printf("Socket creation error\n");
WSACleanup();
}
else
{
printf("Socket Created\n");
}
fepAddr.sin_family = AF_INET;
fepAddr.sin_port = htons(inputData.portNo);
fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr);
if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR)
{
printf("bind() failed: %ld.\n", WSAGetLastError());
closesocket(sockID);
return 0;
}
else
{
printf("bind() is OK!\n");
}
memset(udpBuf,sizeof(udpBuf),0);
while (recvData)
{
printf("receiving data\n");
recvResult = recvfrom( sockID, udpBuf, sizeof(udpBuf), 0,(struct sockaddr *)&fepAddr, &sock_len);
fprintf(udp, "%s", udpBuf);
//fwrite(udpBuf, sizeof(udpBuf), 1, udp);
recvData-- ;
}
exit:
if(udp)
{
fclose(udp);
udp = 0;
}
//shutdown socket
closesocket(sockID);
fclose(udp);
recvfrom逐包接收UDP数据包。如果给定的数据包太大,recvfrom将返回一个错误。至于计时,您可以使用select来知道套接字何时可读 试着这样做:
sockID = socket(AF_INET, SOCK_DGRAM, 0);
if (sockID == INVALID_SOCKET)
{
printf("Socket creation error\n");
goto exit;
}
printf("Socket Created\n");
memset(&fepAddr, 0, sizeof(fepAddr));
fepAddr.sin_family = AF_INET;
fepAddr.sin_port = htons(inputData.portNo);
fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr);
if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR)
{
printf("bind() failed: %ld.\n", WSAGetLastError());
goto exit;
}
printf("bind() is OK!\n");
memset(udpBuf, 0, sizeof(udpBuf));
printf("receiving data\n");
while (...)
{
printf(".");
recvResult = recvfrom(sockID, udpBuf, sizeof(udpBuf), 0, (struct sockaddr *)&fepAddr, &addr_len);
if (recvResult == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
printf("\nrecvfrom() failed: %ld.\n", WSAGetLastError());
goto exit;
}
fd_set fd;
FD_ZERO(&fd);
FD_SET(sockID, &fd);
timeval t;
t.tv_sec = ...; // seconds
t.tv_usec = ...; // microseconds
selectResult = select(0, &fd, NULL, NULL, &t);
if (selectResult == SOCKET_ERROR)
{
printf("\nselect() failed: %ld.\n", WSAGetLastError());
goto exit;
}
if (selectResult == 0)
{
printf("\nsocket timed out.\n");
goto exit;
}
continue;
}
if (recvResult > 0)
fwrite(udpBuf, recvResult, 1, udp);
}
exit:
if (udp != 0)
{
fclose(udp);
udp = 0;
}
if (sockID != INVALID_SOCKET)
{
closesocket(sockID);
sockID = INVALID_SOCKET;
}
我还需要一个帮助…我使用socketPF_数据包、SOCK_raw、ETH_P_IP创建了原始套接字…但它给出的参数无效…如何创建原始套接字以从端口接收udp数据包??SOCK_raw在PF_数据包族中不可用。它仅在AF_INET和AF_INET 6系列中可用。即使端口不可用,绑定也会成功。它返回零。原因是什么???在Windows上,如果您将套接字绑定到一个通配符地址,即:ADDR_any,那么到NIC的物理绑定可能会在内部延迟,直到调用listen为止,在bind退出很久之后。在这种情况下,bind无法报告错误。错误将来自侦听。MSDN在listen文档中对此进行了描述。另外,另一方面,从xpsp2开始的SOCK_原始套接字不允许绑定。MSDN也对此进行了记录。