服务端:
// UdpSrv.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <string>
#pragma comment(lib,"ws2_32")
using namespace std;
// 输出日志
void writeLog(const char *ip, const char* msg);
// 创建UDP服务端
bool createUdpServer();
int main()
{
//writeLog("10.0.0.1", "Hello world!");
printf("程序开始运行!\r\n");
createUdpServer();
return 0;
}
void writeLog(const char *ip, const char* msg)
{
string strMsg;
SYSTEMTIME st;
::GetLocalTime(&st);
char timeBuf[32] = {0};
sprintf_s(timeBuf,32,"%04d%02d%02d_%02d%02d%02d%03d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
strMsg = timeBuf;
strMsg = timeBuf + string(" ") + string(ip) + string(" ")+string(msg)+string("\r\n");
printf(strMsg.c_str());// 打印到console
}
bool createUdpServer()
{
// 初始化套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return false;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return false;
}
printf("server is operating!\r\n");
// 创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);// 失败返回INVALID_SOCKET
if (sockSrv == INVALID_SOCKET) {
printf("Failed. Error code:%d", WSAGetLastError());
}
SOCKADDR_IN addrSrv;// 定义sockSrv发送和接收数据包的地址
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8000);
// 绑定套接字,绑定到端口
if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR) {
printf("Failed bind,error code: %d \r\n", WSAGetLastError());
return false;
}
SOCKADDR_IN addrClient;// 用来接收客户端的地址信息
int len = sizeof(SOCKADDR);
char recvBuf[100];
char addrClientIp[32] = { 0 };
while (1) {
// 等待并接收数据
memset(addrClientIp, 0, 32);
memset(recvBuf, 0, 100);
int iRecv = recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
if (iRecv > 0) {
sprintf_s(addrClientIp, "%d.%d.%d.%d:%d", addrClient.sin_addr.S_un.S_un_b.s_b1,
addrClient.sin_addr.S_un.S_un_b.s_b2, addrClient.sin_addr.S_un.S_un_b.s_b3,
addrClient.sin_addr.S_un.S_un_b.s_b4,ntohs(addrClient.sin_port));
writeLog(addrClientIp, recvBuf);
}
}
::closesocket(sockSrv);
WSACleanup();
}
客户端:
// UdpClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <WS2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32")
bool sendLog(SOCKET s,const char* ip, short port,const char* msg);
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return false;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return false;
}
printf("client is operating!\r\n");
SOCKET s = ::socket(AF_INET, SOCK_DGRAM,0);
if (s == INVALID_SOCKET) {
printf("Failed. Error code:%d", WSAGetLastError());
}
// 发送数据
while (1)
{
string msg;
cin >> msg;
if (msg == "quit") {
break;
}
sendLog(s, "192.168.1.9", 8000, msg.c_str());
}
::closesocket(s);
WSACleanup();
return 0;
}
bool sendLog(SOCKET s, const char* ip, short port, const char* msg)
{
// 填写远程地址信息
sockaddr_in addr;
//addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.9");
inet_pton(AF_INET, ip, &addr.sin_addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
::sendto(s, msg, strlen(msg), 0, (sockaddr*)&addr,sizeof(addr));
return true;
}
运行结果: