win32 socket 编程(六)——UDP
基于 UDP 无连接的 socket 编程
一、服务器端操作流程
1.1加载套接字库(WSAStartup)
1.2 创建套接字 (socket)
1.3将创建的套接字绑定到一个本地地址和端口上 (bind)
1.4等待接收数据。后与客户端实现实时交流 (recvfrom / sendto)
1.5关闭套接字
recvfrom函数将接收一个数据报信息并保存源地址。函数原型如下:
int recvfrom(SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen);
a) s:准备接收数据的套接字。
b) buf:指向缓冲区的指针,该缓冲区用来接收数据。
c) len:缓冲区的长度。
d) flags:收发数据方式的标识,如果不需要特殊要求可以设置为0。
e) from:指向地址的结构体指针,用来接收发送数据方的地址信息。
f) fromlen:地址结构的大小。
sendto函数将向一个特定的目的方放松数据。其函数原型如下:
int sendto(SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen);
参数:
a)s:是一个(可能已建立连接的)套接字描述符。
b) buf:指向缓冲区的指针,该缓冲区包含将要发送的数据。
c) len:指定缓冲区中的数据长度。
d) flags:收发数据方式的标识,如果不需要特殊要求可以设置为0。
n to:该指针指向目标套接字的地址;
e) tolen:指定的地址长度
二、服务器端实例(UDP)
#include "stdafx.h"
#include <winsock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
WORD wVersion;
WSADATA wsaData;
int er;
//1.初始化版本信息
wVersion = MAKEWORD(, );
//加载套接字库
er = WSAStartup(wVersion, &wsaData);
if (er != )
{
return -;
}
//检测套接字版本信息
if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return -;
} //2.创建服务器端套接字
SOCKET sockSer = socket(AF_INET, SOCK_DGRAM, );
SOCKADDR_IN addr_in;
addr_in.sin_family = AF_INET;//地址族
addr_in.sin_port = htons();//端口
addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//IP
bind(sockSer, (sockaddr*)&addr_in, sizeof(addr_in)); SOCKADDR_IN client_addr;
int len = sizeof(sockaddr_in);
char recvBuf[];
recvfrom(sockSer, recvBuf, sizeof(recvBuf), ,(sockaddr*)&client_addr,&len);
cout << "接受到的数据:" << recvBuf << endl;
//向客户端发送数据
sendto(sockSer, recvBuf, sizeof(recvBuf), , (sockaddr*)&client_addr, len);
closesocket();
WSACleanup();
system("pause");
return ;
}
三、客户端操作流程
3.1加载套接字库 (WSAStartup)
3.2创建套接字 (socket)
3.3向服务器发送数据。后与服务端实现实时交流 (recvfrom / sendto)
3.4关闭套接字 (closesocket)
四、客户端实例(UDP)
#include "stdafx.h"
#include <winsock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
WORD wVersion;
WSADATA wsaData;
int er;
//1.初始化版本信息
wVersion = MAKEWORD(, );
//加载套接字库
er = WSAStartup(wVersion, &wsaData);
if (er != )
{
return -;
}
//检测套接字版本信息
if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return -;
} //2.创建服务器端套接字
SOCKET sockSer = socket(AF_INET, SOCK_DGRAM, );
SOCKADDR_IN addr_in;
addr_in.sin_family = AF_INET;//地址族
addr_in.sin_port = htons();//端口
addr_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
bind(sockSer, (sockaddr*)&addr_in, sizeof(addr_in)); SOCKADDR_IN addr;
int len = sizeof(addr); //向服务器发送数据
char sendBuf[];
sendto(sockSer, sendBuf, sizeof(sendBuf), , (sockaddr*)&addr, len);
//接受数据
char recvBuf[];
recvfrom(sockSer, recvBuf, sizeof(recvBuf), , (sockaddr*)&addr, &len);
cout << "接受到服务器端的数据:" << recvBuf << endl;
closesocket();
WSACleanup();
system("pause");
return ;
}
五、UDP工作原理图
win32 socket 编程(六)——UDP的更多相关文章
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
- win32 socket 编程(三)——TCP/IP
一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...
- java Socket编程-基于UDP
package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...
- C语言socket编程----实现UDP通信
TCP/IP协议叫做传输控制/网际协议,又叫做网络通信协议.实际上,它包括上百个功能的协议. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算程序的通信方式. 套接字分为三类; 流式 ...
- C# socket编程 使用udp实现单对单的连接对话
ipLocalPoint = new IPEndPoint(IPAddress.Parse("192.168.31.122"), 5000); //定义网络类型,数据连接类型和网络 ...
- linux网络编程之socket编程(六)
经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...
- win32 socket编程(四)——服务器端实例(TCP)
//Server服务器端Server.cpp 1 // 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h& ...
- win32 socket 编程(一)——TCP/IP
一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时, ...
- Socket编程的UDP与TCP,应用在哪些地方
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1,网速的提升给UDP稳定性提供可靠网络保障 CD ...
随机推荐
- React Native 中 跨页面间通信解决方案之 react-native-event-bus
https://github.com/crazycodeboy/react-native-event-bus 用法: A页面和B页面中都有相同的列表,点击B页面中的收藏按钮,A页面会跟着更新 impo ...
- php 处理错误和异常技巧
set_time_limit(0); ini_set('memory_limit','1024M'); function exception_handler($exception) { echo &q ...
- 记一下今天上下班学的Thread
1 Thread 默认为前台线程,即主程序退出后,线程还可以继续(曾经就掉入这个坑中,使用两线程分别进行UDP收发,结果发线程结束了退出方法,收线程还在继续) 2 Thread 没有可以暂停,可以重新 ...
- APK文件结构和安装过程
APK文件结构Android应用是用Java编写的,利用Android SDK编译代码,并且把所有的数据和资源文件打包成一个APK (Android Package)文件,这是一个后缀名为.apk的压 ...
- ES的副本数量、插入大批量数据前,副本数应该设置为0
多副本可以提升检索的能力,但是如果副本数量太多,插入数据的时候容易出现卡顿现象: 因为主分片要把数据同步给所有的副本,所以建议副本数量最好是1-2个: ---- Es在索引数据的时候,如果存在副本,那 ...
- 关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案。
错误一.关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案. ...
- sql server 高版本数据还原到低版本sql server的注意事项
生成的sql脚本不能大于100m,否则会报错(System.OutOfMemory) 所以要将较大的sql脚本文件进行分割
- zk的KeeperErrorCode = ConnectionLoss错误
额,这东西都快把人搞崩溃了,各种排查各种正常. 最后竟然是因为我在客户端未连接上zkserver的时候就进行了create操作造成的错误. 噗, Exception in thread "m ...
- Unity各版本差异
Unity各版本差异 version unity 5.x 4.x 2017 差异 特点 首先放出unity的下载地址,然后再慢慢分析各个版本.再者unity可以多个版本共存,只要不放在同一目录下. ...
- leetcode-mid-array-73 set matrix zeros
mycode 空间复杂度 m+n 思路:用set把为0元素所在行.列记录下来 注意:注释的方法更快 class Solution(object): def setZeroes(self, matrix ...