前天写了一个基于tcp协议的服务器客户端程序,今天写了一个基于UDP协议的,由于在上一篇使用TCP协议的服务器中注释已经较为详细,且许多api的调用是相同的,故不再另外注释。

使用UDP协议需要注意几点:

①UDP是面向无连接的,客户端在于服务器通信前无须建立连接,且UDP协议不保证发出的消息是否被收到,是否有丢失。

②UDP的接收和发送信息使用recvfrom()与sendto()函数

代码如下:

服务器端:

 #include <iostream>
#include "Ws2tcpip.h"
#include "Winsock2.h" using std::cin;
using std::cout;
using std::cerr;
using std::endl; #pragma comment(lib, "ws2_32.lib") int SOCKADDR_IN_SIZE = sizeof(SOCKADDR_IN);
const u_short DEFAULT_PORT = ;
const size_t MSG_BUF_SIZE = ;
const size_t IP_BUF_SIZE = ; int main() {
WSADATA wsa_data;
SOCKET sock_serv = INVALID_SOCKET;
SOCKADDR_IN addr_serv, addr_clt;
char ip_buf[IP_BUF_SIZE];
char msg_buf[MSG_BUF_SIZE];
int ret_val = ;
//
ret_val = WSAStartup(MAKEWORD(, ), &wsa_data);
if (ret_val != ) {
cerr << "WSAStartup() function failed with error: " << WSAGetLastError() << "\n";
system("pause");
return ;
}
//
//SecureZeroMemory(&addr_serv, SOCKADDR_IN_SIZE);
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(DEFAULT_PORT);
addr_serv.sin_addr.S_un.S_addr = ADDR_ANY;
//
sock_serv = socket(addr_serv.sin_family, SOCK_DGRAM, IPPROTO_UDP);
if (sock_serv == INVALID_SOCKET) {
cerr << "socket() function failed with error: " << WSAGetLastError() << "\n";
WSACleanup();
system("pause");
return ;
}
//
ret_val = bind(sock_serv, (SOCKADDR*)&addr_serv, SOCKADDR_IN_SIZE);
if (ret_val != ) {
cerr << "bind() function failed with error: " << WSAGetLastError() << "\n";
system("pause");
return ;
}
cout << "A UDP server has started successfully..." << endl;
//
while (true) {
SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
ret_val = recvfrom(sock_serv, msg_buf, MSG_BUF_SIZE, , (SOCKADDR*)&addr_clt, &SOCKADDR_IN_SIZE);
if (ret_val > ) {
inet_ntop(addr_clt.sin_family, &addr_clt, ip_buf, IP_BUF_SIZE);
cout << "message from client " << ip_buf << ": " << msg_buf << endl;
cout << "enter the message to response: ";
cin.getline(msg_buf, MSG_BUF_SIZE);
sendto(sock_serv, msg_buf, strlen(msg_buf), , (SOCKADDR*)&addr_clt, SOCKADDR_IN_SIZE);
}
else if (ret_val == ) {
cout << "connection is closed..." << endl;
}
else {
cerr << "recvfrom() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_serv);
WSACleanup();
system("pause");
return ;
}
}
ret_val = shutdown(sock_serv, SD_BOTH);
if (ret_val == SOCKET_ERROR) {
cerr << "shutdown() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_serv);
WSACleanup();
system("pause");
return ;
}
closesocket(sock_serv);
WSACleanup();
cout << "server shutdown..." << endl;
system("pause");
return ;
}

客户端:

 #include <Winsock2.h>
#include <WS2tcpip.h>
#include <iostream> using std::cout;
using std::cin;
using std::cerr;
using std::endl; #pragma comment(lib, "ws2_32.lib") const int MSG_BUF_SIZE = ;
int SOCKADDR_SIZE = sizeof(SOCKADDR);
const int SERV_PORT = ;
const char *SERV_IP = "127.0.0.1"; int main() {
WSADATA wsa_data;
SOCKET sock_clt = INVALID_SOCKET;
SOCKADDR_IN addr_serv;
char msg_buf[MSG_BUF_SIZE];
int ret_val = ;
//
ret_val = WSAStartup(MAKEWORD(, ), &wsa_data);
if (ret_val != ) {
cerr << "WSAStartup() function failed with error: " << WSAGetLastError() << "\n";
system("pause");
return ;
}
//
sock_clt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock_clt == INVALID_SOCKET) {
cerr << "socket() function failed with error: " << WSAGetLastError() << "\n";
WSACleanup();
system("pause");
return ;
}
//
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(SERV_PORT);
ret_val = InetPton(addr_serv.sin_family, SERV_IP, &addr_serv.sin_addr);
if (ret_val != ) {
cerr << "inet_pton() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_clt);
WSACleanup();
system("pause");
return ;
}
//
cout << "A UDP client has already started successfully..." << endl;
//
//SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
while (true) {
cout << "enter the message you want to send: ";
cin.getline(msg_buf, MSG_BUF_SIZE);
ret_val = sendto(sock_clt, msg_buf, strlen(msg_buf), , (SOCKADDR*)&addr_serv, SOCKADDR_SIZE);
if (ret_val == SOCKET_ERROR) {
cerr << "sendto() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_clt);
WSACleanup();
system("pause");
return ;
}
SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
ret_val = recvfrom(sock_clt, msg_buf, MSG_BUF_SIZE, , (SOCKADDR*)&addr_serv, &SOCKADDR_SIZE);
if (ret_val > ) {
cout << "feedback from the server: " << msg_buf << endl;
}
else if (ret_val == ) {
cout << "connection is closed..." << endl;
}
else {
cerr << "recvfrom() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_clt);
WSACleanup();
system("pause");
return ;
}
}
ret_val = shutdown(sock_clt, SD_BOTH);
if (ret_val == SOCKET_ERROR) {
cerr << "shutdown() function failed with error: " << WSAGetLastError() << "\n";
closesocket(sock_clt);
WSACleanup();
system("pause");
return ;
}
closesocket(sock_clt);
WSACleanup();
system("pause");
return ;
}

c++下基于windows socket的服务器客户端程序(基于UDP协议)的更多相关文章

  1. c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)

    今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...

  2. c++下基于windows socket的多线程服务器(基于TCP协议)

    之前用c++实现过基于windows socket的单线程TCP服务器(http://www.cnblogs.com/jzincnblogs/p/5170230.html),今天实现了一个多线程的版本 ...

  3. Python_服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

    1.服务器与多客户端通信 import socket # 创建tcp socket的套接字 sk = socket.socket() # bind sk.bind(('127.0.0.1',8080) ...

  4. 在Windows Server 2012服务器上安装可靠多播协议

    为什么要安装可靠多播协议?   答:随着因特网的发展,出现了视频点播.电视会议.远程学习.计算机协同工作等新业务.传统的点到点通信方式,不仅浪费大量的网络带宽,而且效率很低.一种有效利用现有带宽的技术 ...

  5. Python 调用multiprocessing模块下面的Process类方法(实现服务器、客户端并发)-UDP协议

    #基于UDP协议的multiprocessing自定义通信 服务端: from multiprocessing import Process import socket def task(server ...

  6. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  7. [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)

    介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载 点ZIP下载 接下来,用Xcode新建一个工程 将以下 ...

  8. Windows Server 2016-MS服务器应用程序兼容性列表

    该表罗列支持 Window Server 2016 上安装和功能的 Microsoft 服务器应用程序. 此信息用于快速参考,不用于替代有关单个产品的规格.要求.公告或每个服务器应用程序的常规通信的说 ...

  9. C#调用windows API实现 smallpdf客户端程序进行批量压缩

    一.背景 Smallpdf 网站针对PDF文件提供了非常齐全的功能:PDF 与 Word.PPT.Excel.JPG 的相互转化.PDF 的压缩.编辑.合并.分割.解密.加密等功能,用户无需注册即可免 ...

随机推荐

  1. 一键安装lnmp(2)

    all(){path=`pwd`cd $pathechoecho "exclude=*.i386 *.i686" >> /etc/yum.confrpm -ivh ht ...

  2. Linux安装ftp组件vsftpd

    1 安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. [root@bogon ~]# yum -y install vsftpd 2 添 ...

  3. char,short,int长度

    数据类型的本质就是固定内存大小的别名 char:1byte short:  2byte int:4byte 其实变量也是对连续内存的别名,相当于这段内存的句柄.钩子

  4. 使用BusyBox制作根文件系统

    1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 gre ...

  5. Xcode8编辑代码崩溃解决办法

    更新了Xcode8带来了一系列问题,最大的困扰就是不支持插件了,而且最关键的是一敲代码就崩溃(就是写一个字母就开始崩),在网上找了很多解决,发现是之前装的插件遗留下来的问题,将插件全部删掉就解决了,下 ...

  6. SpringMVC基于注解方式的quartz

    项目框架: SpringMVC.MyBatis.JSP 1. 首先配置spring.xml文件 <?xml version="1.0" encoding="UTF- ...

  7. prometheus statsd 监控

    Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们 ...

  8. LeetCode——minimum-path-sum

    Question Given a m x n grid filled with non-negative numbers, find a path from top left to bottom ri ...

  9. hdu4310 - Hero - 简单的贪心

    2017-08-26  15:25:22 writer:pprp 题意描述: • 1 VS n对战,回合制(你打他们一下,需要受到他们所有存活人的攻击)• 你的血量无上限,攻击力为1• 对手血量及攻击 ...

  10. git-svn — 让git和svn协同工作

     git-svn — 让git和svn协同工作 svn作为一个优秀源码版本的管理工具,可以适合绝大多数项目.但是因为它的采用中心化管理,不可避免的存在本地代码的备份和版本管理问题.也就是说对于尚未或暂 ...