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 的压缩.编辑.合并.分割.解密.加密等功能,用户无需注册即可免 ...
随机推荐
- Object的各种方法
Object的一些知识点总结 1.hasOwnProperty obj.hasOwnProperty(prop) 参数 prop: 要检测的属性字符串名称或者Symbol 返回值 用来判断一个对象是否 ...
- [Linux 004]——用户和用户组以及 Linux 权限管理(二)
到权限了.前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理.权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用 ...
- 尝试编辑java程序
尝试编译java程序 之前在用软件eclipse编译过简单的hello java程序,因为软件操作简单,后来学会了用命令符来编译程序.代码如下 public class abc { ...
- Linux下的Nginx安装
1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有g ...
- Ubuntu 设置为固定ip
vmware设置为桥接模式 使用root登陆ubuntu 使用gedit打开/etc/network/interfaces auto lo iface lo inet loopback auto en ...
- Spring Boot 上传图片文件
步骤一:基于前面springboot入门小demo 基于的springboot入门小demo,已包含了前面文章的知识点(比如:热部署.全局异常处理器). 步骤二:创建uploadPage.jsp上传页 ...
- easyui combobox 拼音检索快捷选择输入
easyui combobox 拼音检索快捷选择输入 效果如图 $.ajax({ url: UserActionUrl + '?action=listuserworktype', dataType ...
- Web前端可以转行做游戏吗?
作者:ManfredHu 链接:http://www.manfredhu.com/2018/03/15/31-laya-game-tips/index.html 声明:版权所有,转载请保留本段信息,谢 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- 配置servlet支持文件上传
Servlet3.0为Servlet添加了multipart配置选项,并为HttpServletRequest添加了getPart和getParts方法获取上传文件.为了使Servlet支付文件上传需 ...