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 的压缩.编辑.合并.分割.解密.加密等功能,用户无需注册即可免 ...
随机推荐
- linux块设备读写流程
在学习块设备原理的时候,我最关系块设备的数据流程,从应用程序调用Read或者Write开始,数据在内核中到底是如何流通.处理的呢?然后又如何抵达具体的物理设备的呢?下面对一个带Cache功能的块设备数 ...
- ubuntu下 gedit中文乱码
Gedit 3.x 版本设置 (适用于Ubuntu 11.10及以后) 命令方式 gsettings set org.gnome.gedit.preferences.encodings auto-de ...
- valid 校验方式
校验参数方法:1.最简单的方式是,使用Java bean注解校验(如 @NotEmpty...)2.适合复杂点的自定义校验(推荐) 2.1 先定义一个校验接口: public interface Va ...
- Pandas学习1
pandas有两种自己独有的基本数据结构Series和DataFrame Series 数据结构 data 100 300 500 index 0 1 2 或者 index data 0 100 1 ...
- C# 操作FTP
操作FTP管理类: using System; using System.Collections.Generic; using System.Text; using System.Net; using ...
- HttpServletRequest request方法详解
//1.获取请求参数 //获取参数的单个值,如有多个则只返回第一个 String parameter1 = request.getParameter("demo"); //获取参数 ...
- codeforces781C Underground Lab
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Android自定义view-CircleSeekbar
自定义view练手,效果图如下:实现功能 可设置圆环颜色和线宽及触摸后的颜色和线宽 可设置圆环内圈显示的文本内容及字体大小.颜色 可设置触摸点的图片 可设置触摸的有效范围 源码git ...
- go-statsd项目
linux命令: 进程:top 收包丢包:netstat -su[c持续输出] go tool pprof: 我们可以使用go tool pprof命令来交互式的访问概要文件的内容.命令将会分析指定的 ...
- python判断指定路径是否存在
https://www.cnblogs.com/jhao/p/7243043.html