前天写了一个基于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. kali 2.0下搭建DVWA环境

    DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...

  2. 20145313Java第五次实验

    实验内容 网络编程TCP代码的结对完成,一人服务器,一人客户端,进行数据传输. 结伴对象:20145313卢鑫 实验步骤 本次实验中,需要两台电脑互联.一台电脑开启无线网,充当客户端,另一台连入局域网 ...

  3. 20145328 《Java程序设计》第10周学习总结

    20145328 <Java程序设计>第10周学习总结 资料学习内容总结 网络编程 13.1 网络概述 网络编程技术是当前一种主流的编程技术,随着联网趋势的逐步增强以及网络应用程序的大量出 ...

  4. static变量、static方法之间的异同

        private SchemeBean getEmptyScheme() {        SchemeBean scheme = new SchemeBean();        scheme ...

  5. PAT1072. Gas Station (30)

    题目的测试用例数据有问题! 第一个Case 应该是 G1 2.0 3.2 一直在想3.3分母的3怎么来了.ORZ #include <iostream> #include <ccty ...

  6. Linux段错误及GDB Coredump调试方法

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fa ...

  7. Vim练级攻略(转)

    转自平凡的世界:http://www.ccvita.com/ 前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年 ...

  8. UVa 10765 鸽子和炸弹(割点)

    https://vjudge.net/problem/UVA-10765 题意: 给一个n个点的无向图,求每个点删去后形成的连通分量数. 思路: 判断割点,如果是割点的话,在dfs的时候计算出删去它后 ...

  9. css hover dropdown

    html-------------------------- <div class="dropdown"> <span>鼠标移动到我这!</span& ...

  10. NumPy教程目录

    NumPy Ndarray对象 NumPy数组属性 NumPy数据类型 NumPy数组创建例程 NumPy来自现有数据的数组 NumPy来自数值范围的数组 NumPy切片和索引 NumPy - 高级索 ...