【读书笔记】TCP/IP网络编程 第6章UDP数据传输
来源:互联网 发布:淘宝收藏夹默认公开吗 编辑:程序博客网 时间:2024/05/21 21:45
第6章 UDP数据传输
- UDP数据边界:
TCP数据传输不存在边界,数据传输过程中调用send recv函数的次数不具任何意义
相反,UDP是具有数据边界的协议,传输中调用send recv函数的次数非常重要。因此,输入函数的调用次数应和输出函数的调用次数完全一致,这样才能保证接收全部已发送数据。
- 连接UDP和未连接UDP:
未连接UDP套接字:每次调用sendto时,都向UDP套接字注册目标IP和端口。(若没有bind,则自动分配ip和端口,直到程序结束为止)
每次都可变更目标地址,因此可以重复利用一个UDP向不同的目标传输数据
连接的套接字:对UDP套接字调用connect函数,用于对同一主机长时间的通信。并不意味着要和对方UDP套接字连接,只是向UDP套接字注册目标的IP和端口信息。因为已经指定的收发对象,不仅可以使用sendto、recvfrom ,还可以使用send、recv函数进行通信。
UDP接收端:
#include "stdafx.h"#include <winsock2.h>#include <stdio.h>#include <iostream>using namespace::std;#define BUF_SIZE 1024void ErrorHanding(char * message);void main(){ WSADATA wsaData; SOCKET servSock; char message[BUF_SIZE]; int strLen; int clntAdrSz; SOCKADDR_IN servAdr, clntAdr; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)//加载库并获取库信息填至wsaData ErrorHanding("socket start error!"); servSock = socket(PF_INET, SOCK_DGRAM, 0);//流式套接字,IPV4:UDP if (servSock == INVALID_SOCKET) ErrorHanding("socket create error!"); //设置地址端口 memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET; servAdr.sin_addr.S_un.S_addr = INADDR_ANY; servAdr.sin_port = htons(6000); //套接字绑定地址端口 if (bind(servSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR) ErrorHanding("socket bind error!"); while (1) { clntAdrSz = sizeof(clntAdr); //recvfrom参数:套接字,缓冲区,缓冲区大小,可选参数,存发送端地址信息的结构体,前一参数大小值变量地址 strLen = recvfrom(servSock, message, BUF_SIZE, 0,(SOCKADDR*)&clntAdr,&clntAdrSz); sendto(servSock, message, strLen, 0, (SOCKADDR*)&clntAdr, sizeof(clntAdr)); } closesocket(servSock); WSACleanup(); return ;}void ErrorHanding(char * message){ cout << message << endl; exit(1);}
UDP发送端:
// TcpClient.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <winsock2.h>#include <stdio.h>#include <iostream>using namespace::std;#define BUF_SIZE 1024void ErrorHanding(char * message);void main(){ //加载套接字库 WSADATA wsaData;//保存套接字信息 SOCKET sock;//套接字句柄 char message[BUF_SIZE]; int str_Len; SOCKADDR_IN servAdr ;//保存服务器的地址信息 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)//加载库并获取库信息填至wsaData ErrorHanding("socket start error!"); //创建套接字 sock = socket(PF_INET, SOCK_DGRAM, 0);//流式套接字,IPV4:TCP if (sock == INVALID_SOCKET) ErrorHanding("socket create error!"); //设置地址端口 memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET;//地址族 servAdr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本地回路IP地址 字节顺序转换 servAdr.sin_port = htons(6000);//与服务器端口一致 字节顺序转换 //向套接字注册目标主机信息,并不是真的建立连接 connect(sock, (SOCKADDR*)&servAdr, sizeof(servAdr)); while (1) { fputs("Input message(Q to quit):", stdout); fgets(message, BUF_SIZE, stdin); if (!strcmp(message, "q\n") || !strcmp(message, "Q\n")) break; //sendto(sock, message, strlen(message), 0, (SOCKADDR*)&servAdr, sizeof(servAdr)); //SOCKADDR_IN clntAdr; //int clntAdrSz = sizeof(clntAdr); //str_Len = recvfrom(sock, message, BUF_SIZE, 0, (SOCKADDR*)&clntAdr, &clntAdrSz); send(sock, message, strlen(message), 0); str_Len = recv(sock, message, BUF_SIZE - 1, 0); message[str_Len] = 0; printf("Message from server: %s ", message); } closesocket(sock); WSACleanup(); return;}void ErrorHanding(char * message){ cout << message << endl; exit(1);}
阅读全文
0 0
- 【读书笔记】TCP/IP网络编程 第6章UDP数据传输
- 【读书笔记】TCP/IP网络编程 第2章
- 【读书笔记】TCP/IP网络编程 第4章 回声
- 【读书笔记】TCP/IP网络编程 第7章 半关闭
- 【读书笔记】TCP/IP网络编程 第17章 Linux epoll
- 【读书笔记】TCP/IP网络编程 第18章 多线程并发
- 【读书笔记】TCP/IP 网络编程 第23章 IOCP模型
- 第23天 网络编程、udp、tcp,ip
- 网络编程 UDP 数据传输
- 【UNIX网络编程读书笔记】第二章 传输层 TCP/UDP
- 【读书笔记】TCP/IP网络编程 第12章 I/O复用
- 【读书笔记】TCP/IP网络编程 第14章 多播、广播
- 【读书笔记】TCP/IP网络编程 第21章 异步通知I/O模型
- 【读书笔记】TCP/IP网络编程 第22章 异步/重叠IO模型
- 【读书笔记】TCP/IP网络编程 第23章 纯重叠I/O实现回声
- 网络编程之---TCP/IP UDP总结
- TCP/IP网络编程之UDP
- TCP/IP网络编程之UDP
- UGUI流光特效(王者荣耀效果)
- cad如何转换成jpg格式
- oracle 从一个oracle导数据到另外一个oracle
- SpringBoot 下 SpringSecurity 入门搭建
- leetcode--Summary Ranges
- 【读书笔记】TCP/IP网络编程 第6章UDP数据传输
- [RK3288][Android6.0] SoftMAC或FullMAC使用的判断
- Android开发错误:Error:” ” is not translated in “en” (English) [MissingTranslation]如何处理?
- go语言 取出在mapA而不在mapB中的键
- Python入门3_之使用字符串
- ipython notebook
- 数据结构中各种排序思路详解
- 将链表中数据域为key 的节点删除(链表有重复值)
- find 命令