基于 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的更多相关文章

  1. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  2. win32 socket 编程(三)——TCP/IP

    一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...

  3. java Socket编程-基于UDP

    package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...

  4. C语言socket编程----实现UDP通信

    TCP/IP协议叫做传输控制/网际协议,又叫做网络通信协议.实际上,它包括上百个功能的协议. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算程序的通信方式. 套接字分为三类; 流式 ...

  5. C# socket编程 使用udp实现单对单的连接对话

    ipLocalPoint = new IPEndPoint(IPAddress.Parse("192.168.31.122"), 5000); //定义网络类型,数据连接类型和网络 ...

  6. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...

  7. win32 socket编程(四)——服务器端实例(TCP)

    //Server服务器端Server.cpp 1 // 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h& ...

  8. win32 socket 编程(一)——TCP/IP

    一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时, ...

  9. Socket编程的UDP与TCP,应用在哪些地方

    随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1,网速的提升给UDP稳定性提供可靠网络保障 CD ...

随机推荐

  1. JS——数组中push对象,覆盖问题,每次都创建一个新的对象

    今天写运动框架时,发现将对象push进数组,后面的值会覆盖前面的值,最后输出的都是最后一次的值.其实这一切都是引用数据类型惹的祸.       如果你也有类似问题,可以继续看下去哦.       下面 ...

  2. Go简易分布式对象存储 合并文件的所有分块为一个文件

    项目 项目地址: https://github.com/Draymonders/cloud 欢迎大家Watch or Star 缘由 由于项目中对大文件进行5MB为一个分块上传(多线程,提升上传效率) ...

  3. Andorid 手机WIFI连接的Mac地址和IP地址

    public static String getInfo()     {        WifiManager wifi = (WifiManager) getSystemService(Contex ...

  4. JSP异常处理

    JSP异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常有以下几类异常: 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员无 ...

  5. win7不正常开关机,系统恢复选项

    会win7不正常开关机后,会默认进入“系统回复选项”. 无人值守的机器远程会无法连接,默认会进入此界面. 解决方法: 到现场,鼠标.键盘.显示器, 开机后选择正常启动, 在命令行模式输入以下命令bcd ...

  6. React Native商城项目实战14 - 首页中间下部分

    1.MiddleBottomView.js /** * 首页中间下部分 */ import React, { Component } from 'react'; import { AppRegistr ...

  7. win10蓝屏1

    win10一直蓝屏. 事件查看里有系统错误提示 DCOM部分组件错误,表现为:应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC ...

  8. r hive

    w r只能处理有限量的数据 pdf 467

  9. 在mpvue或者Vue中使用VUEX

    第一个页面Index,主页哦 import Vue from'vue' import Vuex from'vuex' import getters from'./getters' import sta ...

  10. JS手写状态管理的实现(转)

    https://juejin.im/post/5c528411e51d456898361e43