发送端
// UDP_B_发送端.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
//void handle_error(void); /* Error handler routine */
int main()
{
printf_s("进入main函数,请按任意键开始通信发送 \n");
fflush(stdin);
_gettch();
WORD wVersionRequested; /* 需要的socket dll 版本信息 */
WSADATA wsaData; /* data for socket lib initialization */
// 初始化winsock库
wVersionRequested = 0x0101; /* 版本号:1.1 */
if (!WSAStartup(wVersionRequested, &wsaData))
{
// 这里要检查一下版本号是否正确,为简化,去掉了
// 打开一个UDP socket
SOCKET sock; /* socket */
struct sockaddr_in address; /* SOCKET地址 */
if ((sock = socket(AF_INET, SOCK_DGRAM, 0 /*IPPROTO_UDP*/)) != INVALID_SOCKET)
{
address.sin_family = AF_INET; /* internet */
address.sin_port = htons(60000); /* 端口号 */
address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 目的IP地址,向本机发送写"127.0.0.1"
// 循环发送
for (int i = 0; i<5000; i++)
{
int err; /* 错误号 */
char buf[256];
sprintf_s(buf,"Hello,world! i= %d! \n", i);
// 发送这个字符串
err = sendto(sock, buf, strlen(buf), 0, (struct sockaddr *)&address, sizeof(address));
printf_s("Sent: %s \n err: %d \n", buf, err); // err>0时,为发送字节数
Sleep(500);
}
}
}
WSACleanup(); /* clean up before exit */
exit(0);
}
接收端
// UDP_B_接收端.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()