服务端:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <Winsock2.h>
#include<windows.h>
#pragma comment(lib, "WS2_32.lib")
class SeverUDP
{
public:
SeverUDP(int port);
~SeverUDP();
void sendMesg();
private:
void initSocketLib();
private:
SOCKET m_sSeverSocket;
sockaddr_in m_SeverAddr;
};
SeverUDP::SeverUDP(int port)
{
initSocketLib();
m_sSeverSocket = socket(AF_INET, SOCK_DGRAM, 0);
m_SeverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
m_SeverAddr.sin_family = AF_INET;
m_SeverAddr.sin_port = htons(port);
int err = bind(m_sSeverSocket, (SOCKADDR*)&m_SeverAddr, sizeof(SOCKADDR));
if (err < 0)
{
std::cout << "套接字绑定失败" << std::endl;
}
else
{
std::cout << "套接字绑定成功" << std::endl;
}
}
SeverUDP::~SeverUDP()
{
closesocket(m_sSeverSocket);
WSACleanup();
}
void SeverUDP::sendMesg()
{
sockaddr_in clientAddr;
int len = sizeof(SOCKADDR);
char clientBuf[1024];
char recvBuf[1024];
char tempBuf[1024];
while (true)
{
recvfrom(m_sSeverSocket, clientBuf, 1024,0, (SOCKADDR*)&clientAddr, &len);
if (clientBuf[0] == 'q')
{
sendto(m_sSeverSocket, "q", strlen("q") + 1, 0, (SOCKADDR*)&clientAddr, len);
std::cout << "客户端已退出" << std::endl;
break;
}
sprintf_s(tempBuf, "%s 消息:%s", inet_ntoa(clientAddr.sin_addr), clientBuf);
std::cout << tempBuf << std::endl;
std::cout << "请输入回复消息:";
std::cin >> recvBuf;
int result = sendto(m_sSeverSocket, recvBuf, 1024, 0, (SOCKADDR*)&clientAddr, len);
if (result < 0)
{
std::cout << "发送失败" << std::endl;
}
else
{
std::cout << "发送成功" << std::endl;
}
}
closesocket(m_sSeverSocket);
WSACleanup();
}
void SeverUDP::initSocketLib()
{
WORD wudp;
WSADATA wudpData;
int err;
wudp = MAKEWORD(2, 0);
err = WSAStartup(wudp, &wudpData);
if (err != 0)
{
std::cout << "初始化套接字库失败" << std::endl;
return;
}
else
{
std::cout << "初始化套接字库成功" << std::endl;
}
if (LOBYTE(wudpData.wVersion != 2) || HIBYTE(wudpData.wHighVersion != 1))
{
std::cout << "套接字版本不相等" << std::endl;
WSACleanup();
}
else
{
std::cout << "套接字版本相等"<<std::endl;
}
}
int main()
{
SeverUDP *severUDP = new SeverUDP(6886);
severUDP->sendMesg();
return 0;
}
客户端:
#include "stdafx.h"
#include <iostream>
#include <Winsock2.h>
#include <stdio.h>
#include<windows.h>
#pragma comment(lib, "WS2_32.lib")
class ClientUDP
{
public:
ClientUDP(int port);
~ClientUDP();
private:
void initSocketLib();
private:
SOCKET m_sClientSocket;
sockaddr_in m_clientAddr;
};
ClientUDP::ClientUDP(int port)
{
initSocketLib();
m_sClientSocket = socket(AF_INET, SOCK_DGRAM, 0);
m_clientAddr.sin_family = AF_INET;
m_clientAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
m_clientAddr.sin_port = htons(port);
int len = sizeof(SOCKADDR);
char recvBuf[1024];
char sendBuf[1024];
char tempBuf[1024];
while (true)
{
std::cout << "请输入发送的消息:";
std::cin >> sendBuf;
sendto(m_sClientSocket, sendBuf, strlen(sendBuf)+1, 0, (SOCKADDR*)&m_clientAddr, len);
recvfrom(m_sClientSocket, recvBuf, 1024, 0, (SOCKADDR*)&m_clientAddr, &len);
if (recvBuf[0] == 'q')
{
sendto(m_sClientSocket, "q", strlen("q") + 1, 0, (SOCKADDR*)&m_clientAddr, len);
std::cout << "服务器已退出";
break;
}
sprintf_s(tempBuf, "%s 消息 %s", inet_ntoa(m_clientAddr.sin_addr), recvBuf);
std::cout << tempBuf << std::endl;
}
closesocket(m_sClientSocket);
WSACleanup();
}
ClientUDP::~ClientUDP()
{
closesocket(m_sClientSocket);
WSACleanup();
}
void ClientUDP::initSocketLib()
{
WORD client;
WSADATA clientData;
int err;
client = MAKEWORD(2, 0);
err = WSAStartup(client, &clientData);
if (err != 0)
{
std::cout << "套接字初始化失败" << std::endl;
return;
}
else
{
std::cout << "套接字初始化成功" << std::endl;
}
if (LOBYTE (clientData.wVersion != 2) || HIBYTE(clientData.wHighVersion != 1))
{
std::cout << "套接字库版本不对" << std::endl;
WSACleanup();
return;
}
else
{
std::cout << "套接字版本正确" << std::endl;
}
}
int main()
{
ClientUDP* client = new ClientUDP(6886);
return 0;
}