Win32 控制台下的UDP接收程序

这是接收UDP数据的程序,为了简化程序的编写去掉了一些判断错误的地方:

 

  
    
// mywsksvr.cpp : 定义控制台应用程序的入口点。
#include " stdafx.h "
#include
< winsock.h >
#include
< stdio.h >
#define RECVLEN 2000 // 接收缓冲区大小
char buf[RECVLEN]; // 接收缓冲区
#pragma comment(lib, "ws2_32.lib")

int main()
{
WSADATA wWsadata;
WORD wWord;
wWord
= MAKEWORD( 1 , 1 );
if ( ! WSAStartup(wWord, & wWsadata))
{
// 创建SOCKET
SOCKET sock;
if ( (sock = socket(AF_INET, SOCK_DGRAM , 0 /* IPPROTO_UDP */ )) != INVALID_SOCKET )
{
// 在本地地址与端口绑定
SOCKADDR_IN addr;
addr.sin_addr.s_addr
= htonl (INADDR_ANY);
addr.sin_family
= AF_INET;
addr.sin_port
= htons( 60000 ); // 端口要和发送端一致才能收到
// 绑定
bind(sock, (SOCKADDR * ) & addr, sizeof (SOCKADDR));
// 接收数据
SOCKADDR_IN addrClient; // 这个地址在recvfrom收到数据后,存储有发送端的地址
int len = sizeof (SOCKADDR);
int a, n;
fd_set readfds;
timeval timeout
= { 5 , 0 }; // 超时时间为5秒,后面的那个数是微秒值
while ( 1 )
{
FD_ZERO(
& readfds); // 清空readfds与所有句柄的联系
FD_SET(sock, & readfds); // 建立readfds与sock的联系
n = select( 0 , & readfds, NULL, NULL, & timeout); // 接收数据
if (n > 0 )
{
a
= recvfrom(sock,buf,RECVLEN, 0 ,(SOCKADDR * ) & addrClient, & len);
printf(
" recv %s ,len=%d \n " ,buf,a);
if (a == SOCKET_ERROR) // 错误
printf( " *** ERROR. CODE =%d\n " ,WSAGetLastError());
}
else
{
printf(
" %ds recv timeout\n " ,timeout.tv_sec);
}
}
closesocket(sock);
WSACleanup();
}
}
}
// endof main()

 

你可能感兴趣的:(Win32)