网络编程第三讲UDP编写

一丶UDP简介

  UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP

UDP不需要建立建立. 下面有UDP编写流程图

下图为TCP 跟UDP的区别.

UDP下收发函数有区别.

  发送数据: TCP: send UDP sendto

  接受数据:TCP: recv  UDP recvfrom

二丶UDP编写的完整代码

服务端:

  

#include <stdio.h>
#include <winsock2.h>
#include <Windows.h> #pragma comment(lib,"ws2_32.lib")
#define PORT 6000 int main(int argc, char* argv[])
{
//初始化网络环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(, ), &wsa) != )
{
printf("WSAStartup failed\n");
return -;
} //建立一个UDP的socket
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == SOCKET_ERROR)
{
printf("create socket failed\n");
return -;
} //绑定地址信息
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr)); char buf[];
while (TRUE)
{
memset(buf, , );
// 网络节点的信息,用来保存客户端的网络信息
sockaddr_in clientAddr;
memset(&clientAddr, , sizeof(sockaddr_in)); int clientAddrLen = sizeof(sockaddr);
//接收客户端发来的数据
int ret = recvfrom(sock, buf, , ,(sockaddr*) &clientAddr,&clientAddrLen ); printf("Recv msg:%s from IP:[%s] Port:[%d]\n", buf,inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
// 发一个数据包返回给客户
sendto(sock, "Hello World!", strlen("Hello World!"), , (sockaddr*)&clientAddr, clientAddrLen);
printf("Send msg back to IP:[%s] Port:[%d]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
}
return ;
}

客户端

  

#include <stdio.h>
#include <winsock2.h>
#include <Windows.h> #pragma comment(lib,"ws2_32.lib")
#define PORT 6000
int main(int argc, char* argv[])
{
//初始化网络环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(, ), &wsa) != )
{
printf("WSAStartup failed\n");
return -;
}
//建立一个UDP的socket
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockClient == INVALID_SOCKET)
{
printf("create socket failed\n");
return -;
}
// 申明一个网络地址信息的结构体,保存服务器的地址信息
sockaddr_in addr = { };
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); char buf[] = "client test!";
//发送数据
int dwSent = sendto(sockClient, buf, strlen(buf), , (SOCKADDR *)&addr, sizeof(SOCKADDR));
if (dwSent == )
{
printf("send %s failed\n", buf);
return -;
}
printf("send msg:%s\n", buf); char recvBuf[];
memset(recvBuf, , ); sockaddr_in addrSever = { };
int nServerAddrLen=sizeof(sockaddr_in);
// 接收数据
int dwRecv = recvfrom(sockClient, recvBuf, , , (SOCKADDR *)&addrSever,&nServerAddrLen);
printf("Recv msg from server : %s\n", recvBuf);
//关闭SOCKET连接
closesocket(sockClient);
//清理网络环境
WSACleanup();
system("pause");
return ;
}

链接:https://pan.baidu.com/s/11Gzqv-wynDslzCMnTgnpCw密码:8f63

网络编程第三讲UDP编写的更多相关文章

  1. 网游中的网络编程3:在UDP上建立虚拟连接

    目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网络编程3:在UDP上建立虚拟连接 TODO 二.在UDP上建立虚拟连接 介绍 UDP是无连接的,一 ...

  2. Socket网络编程TCP、UDP演示样例

    Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(O ...

  3. C#网络编程入门之UDP

    目录: C#网络编程入门系列包括三篇文章: (一)C#网络编程入门之UDP (二)C#网络编程入门之TCP (三)C#网络编程入门之HTTP 一.概述 UDP和TCP是网络通讯常用的两个传输协议,C# ...

  4. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  5. Linux Linux程序练习十一(网络编程大文件发送UDP版)

    //网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

  6. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

  7. javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)

    通过一段时间对java网络编程相关内容的学习,写下这篇随笔,对这一部分的知识进行梳理和总结. 网络编程 一.网络编程三要素: IP地址:网络会给每个联网的主机分配一个数字的编码地址,该地址就是IP地址 ...

  8. 网络编程原理与UDP实现

    如何发送数据包? Q:当应用程序产生数据的时候,需要去构造数据包并发送到网络上去,但是由谁负责处理呢? A:现代操作系统负责数据包得构造与发送,应用程序只需提供数据. 当应用程序产生数据时,应用程序将 ...

  9. UNIX网络编程——使用select函数编写客户端和服务器

    首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...

随机推荐

  1. # 2019-2020-4 《Java 程序设计》结对项目总结

    2019-2020-4 <Java 程序设计>结对项目阶段总结---<四则运算--整数> 一.需求分析 实现一个命令行程序 要求: 自动生成小学四则运算题目(加,减,乘,除): ...

  2. Nexus安装、使用说明、问题总结

    Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...

  3. JavaScript基础视频教程总结(121-130章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. Day08 (黑客成长日记) 命名空间和作用域

    Day08:命名空间和作用域: 1.命名空间: (1)内置命名空间(python解释器): 就是python解释器一旦启动就可以使用的名字储存在内置命名空间中: eg: len() print() a ...

  5. LAPM 相关实验01

    目录 lab1 静态.动态资源的区别lab2 部署phpMyadminlab3 部署wordpresslab4 编译安装php-Xcache加速器lab5 fcgi实现lamp lab1 静态.动态资 ...

  6. 02 of learning python

    01 input输入的是str类型 如果输入的是数字的话,要记得强制转换一下! 02 isdigit() 这个方法是用来检测字符串是否全部由数字组成 str.isdigit() 如果字符串只包含数字则 ...

  7. [转] OpenStack — nova image-create, under the hood

    I was trying to understand what kind of image nova image-create creates. It's not entirely obvious f ...

  8. Pool:小对象缓存or复用

    对象复用 使用链表作为pool来保存要复用的对象. pool字段 obtain recycle 案例1 android.os.Message private static Message sPool; ...

  9. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  10. Redis 配置内容总结

    命令 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf. 你可以通过 CONFIG 命令查看或设置配置项. (1)config get config_setting_ ...