c++下基于windows socket的服务器客户端程序(基于UDP协议)
前天写了一个基于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协议)的更多相关文章
- c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)
今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...
- c++下基于windows socket的多线程服务器(基于TCP协议)
之前用c++实现过基于windows socket的单线程TCP服务器(http://www.cnblogs.com/jzincnblogs/p/5170230.html),今天实现了一个多线程的版本 ...
- Python_服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制
1.服务器与多客户端通信 import socket # 创建tcp socket的套接字 sk = socket.socket() # bind sk.bind(('127.0.0.1',8080) ...
- 在Windows Server 2012服务器上安装可靠多播协议
为什么要安装可靠多播协议? 答:随着因特网的发展,出现了视频点播.电视会议.远程学习.计算机协同工作等新业务.传统的点到点通信方式,不仅浪费大量的网络带宽,而且效率很低.一种有效利用现有带宽的技术 ...
- Python 调用multiprocessing模块下面的Process类方法(实现服务器、客户端并发)-UDP协议
#基于UDP协议的multiprocessing自定义通信 服务端: from multiprocessing import Process import socket def task(server ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)
介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载 点ZIP下载 接下来,用Xcode新建一个工程 将以下 ...
- Windows Server 2016-MS服务器应用程序兼容性列表
该表罗列支持 Window Server 2016 上安装和功能的 Microsoft 服务器应用程序. 此信息用于快速参考,不用于替代有关单个产品的规格.要求.公告或每个服务器应用程序的常规通信的说 ...
- C#调用windows API实现 smallpdf客户端程序进行批量压缩
一.背景 Smallpdf 网站针对PDF文件提供了非常齐全的功能:PDF 与 Word.PPT.Excel.JPG 的相互转化.PDF 的压缩.编辑.合并.分割.解密.加密等功能,用户无需注册即可免 ...
随机推荐
- fastdfs安装与配置
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...
- 20145310《Java程序设计》第3次实验报告
20145310<Java程序设计>第3次实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 实验步骤 首先使用git设置用户名和ssh公钥 使用git ...
- web视频资料百度云分享
韩顺平 struts视频教程(31讲)密码:hsp789 链接:https://pan.baidu.com/s/1kSP4CFt1gpVikRaqQXkFGA 密码:kzvp 韩顺平 spring ...
- 秒懂算法3——插入排序(C#实现)
算法思路: 将n个元素分成[已排序]和[未排序]两部分.每次将[未排序]中的一个元素取出,插入到已排序中的相应位置.直至所有元素排序完毕. [已排序] [未排序] { { a[0] } ...
- 03_zookeeper伪集群安装
一句话说明白:在1台机器上模拟多台机器,对外提供服务 在理解zookeeper集群安装方法的基础上,本文描述如何将1个机器模拟为3个节点的zookeeper集群,建议先参考阅读本文的前一期 zooke ...
- apache配置ssl
1.确认是否安装ssl模块 是否有mod_ssl.so文件 2.生成证书和密钥 linux下 步骤1:生成密钥 命令:openssl genrsa 1024 > server.key 说 ...
- css hover dropdown
html-------------------------- <div class="dropdown"> <span>鼠标移动到我这!</span& ...
- iview--2
安装iview 接下来进行配置 按照手册 https://www.iviewui.com/docs/guide/start 引入iView 打开我的项目,出现了这么多的错 解决这个问题的办法 如果你用 ...
- 简单UML
http://www.cnblogs.com/pluviophile/p/7542017.html,看了这篇博文感觉这个例子有用遂搬运过来方便查阅 上面的类图就体现了所需要了解的类的6个基本关系 该类 ...
- A4纸网页打印 html网页页面的宽度设置成多少
A4纸竖向打印,html网页页面的宽度设置成多少?这个问题是我们大家所疑惑的,于是网上搜集整理下,希望可以帮助你们 最近开发项目时遇到了网页打印的问题,这是问题之二,打印宽度设置 在公制长度单位与屏幕 ...