现在的位置: 首页 > 综合 > 正文

Win32 控制台下的UDP接收程序

2013年06月18日 ⁄ 综合 ⁄ 共 1109字 ⁄ 字号 评论关闭

这是接收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()

 

抱歉!评论已关闭.