服务器端:Server

函数:

1.inet_addr();//把IP地址转换为长整型
2.inet_ntoa();//将长整型转换为IP地址
3.socket的阻塞和非阻塞:

阻塞模式下:

在程序中,“生产者”读入数据,“消费者”根据需求对读入数据进行处理。通常“生产者”和“消费者”存在于两个线程中,当“生产者”完成读入数据时,使用线程同步机制,例如设置一个事件通知“消费者”,“消费者”接收到这个事件后对读入的数据进行处理。

并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。将可能阻塞套接字的Windows Sockets API调用分为以下四种:

1.输入操作

recv()、recvfrom()、WSARecv()和WSARecvfrom()函数。如果此时套接字缓冲区内没有数据可读,调用线程在数据来前一直睡眠。

2.输出操作

send()、sendto()、WSASend()和WSASendto()函数。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。

3.接受连接

accept()和WSAAcept()函数。等待接受对方的连接请求。如果此时没有连接请求,线程就会进入睡眠状态。

4.外出连接

connect()和WSAConnect()函数。对于TCP连接,客户端以阻塞套接字为参数,调用该函数向服务器发起连接。该函数在收到服务器的应答前,不会返回。这意味着TCP连接总会等待至少到服务器的一次往返时间。

非阻塞模式:

ioctlsocket();//设置socket属性为阻塞或非阻塞;Linux下的函数是:fcntl().
WSAAsyncselect()和WSAEventselect()套接字自动设置为非阻塞
应用程序连续不断地调用recv()函数,直到它返回成功指示为止。浪费系统资源。
解决方法:使用套接字的“I/O模型”来判断非阻塞套接字是否可读可写。

4.getsockopt();//获取输入缓冲区和输出缓冲区的大小(65536即64K)
#include <iostream>
#include <winsock2.h> using namespace std;
#pragma comment(lib, "ws2_32.lib") int main()
{
//1.WSAStartup
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(, );
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) {
printf("WSAStartup failed with error: %d\n", err);
return ;
}
//2.socket
SOCKET sock = socket(AF_INET ,SOCK_DGRAM ,IPPROTO_UDP );
if(sock == INVALID_SOCKET)
{
printf("socket function failed with error = %d\n", WSAGetLastError());
WSACleanup();
return ;
}
//3.bind
sockaddr_in name;
name.sin_family = AF_INET;
name.sin_addr.S_un.S_addr = inet_addr("192.168.1.115");
name.sin_port = htons();
int res = bind(sock,(sockaddr *)&name,sizeof(name));
if(res == SOCKET_ERROR)
{
printf("socket function failed with error = %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return ;
}
//改变Socket属性为非阻塞
//u_long nonzero = 1;
//ioctlsocket(sock ,FIONBIO ,&nonzero );//设为非阻塞(非零)
int SendbufSize,RecvbufSize;
int nsize = sizeof(SendbufSize);
getsockopt(sock,SOL_SOCKET,SO_SNDBUF,(char*)&SendbufSize,&nsize);
getsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char*)&RecvbufSize,&nsize);
cout<<"SendbufSize: "<<SendbufSize<<" RecvbufSize: "<<RecvbufSize<<endl; //4.recvfrom , sendto
char recvbuf[] = {};//接收
sockaddr_in addr;
int len = sizeof(addr);
char sendbuf[] = {};//发送 while()
{
int nres = recvfrom(sock,recvbuf,sizeof(recvbuf),,(sockaddr *)&addr,&len);
int n = nres;//-1
int nn = WSAGetLastError();
if(nres != )
{
cout<<"ip"<<inet_ntoa(addr.sin_addr)<<":"<<recvbuf<<endl;
//cin>>str;
//sendto(sock,sendbuf,sizeof(sendbuf),0,(sockaddr *)&addr,len);
}
}
//5.WSACleanup
closesocket(sock);
WSACleanup();
system("pause");
return ;
}

客户端:

函数:setsockopt()//设置广播权限

客户端可以通过bind绑定服务器,sendto的后两个参数就可以不用设置,bind实现的其实是本地设置,告诉本地操作系统,默认发送地址,当sendto的后两个参数设置,即按地址发送。

#include <iostream>
#include <winsock2.h> using namespace std;
#pragma comment(lib, "ws2_32.lib") int main()
{
//1.WSAStartup
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(, );
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) {
printf("WSAStartup failed with error: %d\n", err);
return ;
}
//2.socket
SOCKET sock = socket(AF_INET ,SOCK_DGRAM ,IPPROTO_UDP );
if(sock == INVALID_SOCKET)
{
printf("socket function failed with error = %d\n", WSAGetLastError());
WSACleanup();
return ;
}
//4.sendto , recvfrom
sockaddr_in name;
name.sin_family = AF_INET;
name.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
name.sin_port = htons();//host to net short
int len = sizeof(name);
char buf[] = {};
//设置广播权限
BOOL bflag = TRUE;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&bflag , sizeof(bflag)); while()
{
cin>>buf;
int n = sendto(sock,buf,sizeof(buf),,(sockaddr *)&name,len);
int nn = GetLastError();
//int nres = recvfrom(sock,buf,sizeof(buf),0,0,0);
//if(nres > 0)
//{
// cout<<buf<<endl;
//}
}
//5.WSACleanup
closesocket(sock);
WSACleanup();
system("pause");
return ;
}

UDP:1.面向无连接(广播) 有限广播(255.255.255.255):本局域网内传输,不能跨路由器

              直接广播(192.168.3.255)      :本网段内传输,可以跨路由器

    2.数据报(不可拆分)当接收区容量小于发送区时,丢弃多余部分

    3.传输效率高(无延迟):报头8字节

    4.组播

    

UDP数据报的更多相关文章

  1. TCP 流模式与UDP数据报模式(转)

    TCP流模式与UDP数据报模式http://blog.csdn.net/s3olo/article/details/7914717 数据报(datagram)通常是指起始点和目的地都使用无连接网络服务 ...

  2. MAC帧格式、IPV4数据报格式、TCP报文格式、UDP数据报格式

    1.MAC帧格式 类型:2字节,指出数据域中携带的数据应交给哪些协议实体处理 校验码:校验数据段(采用32位CRC冗余校验方式进行校验) 2.IPV4数据报 版本:IP协议版本,这里为4 首部长度:占 ...

  3. [TCP/IP] TCP流和UDP数据报之间的区别

    TCP流和UDP数据报之间的区别 1.TCP本身是面向连接的协议,S和C之间要使用TCP,必须先建立连接,数据就在该连接上流动,可以是双向的,没有边界.所以叫数据流 ,占系统资源多 2.UDP不是面向 ...

  4. 计算机网络协议,UDP数据报的分析

    一.UDP数据报的特点 1.基本特性 UDP是在IP数据报的基础上增加了复用和分用以及差错检测的功能 UDP的主要特点如下: UDP是无连接的:即发送数据之前不需要建立连接 UDP使用尽最大努力交付, ...

  5. TCP字节流和UDP数据报区别

    两者的区别在于TCP接收的是一堆数据,而每次取多少由主机决定;而UDP发的是数据报,客户发送多少就接收多少. 拥有这些区别的原因是由于TCP和UDP的特性不同而决定的.TCP是面向连接的,也就是说,在 ...

  6. TCP/IP具体解释--UDP数据报中的IP分片

    1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...

  7. 那些年的 网络通信之 UDP 数据报包传输---

    下面是 一个多线程,基于 UDP 用户数据报包 协议 的 控制台聊天小程序 import java.io.*; import java.net.*; class Send implements Run ...

  8. 浅析TCP字节流与UDP数据报的区别

    转自http://www.linuxidc.com/Linux/2014-11/109545.htm “TCP是一种流模式的协议,UDP是一种数据报模式的协议”,这句话相信大家对这句话已经耳熟能详~但 ...

  9. 网络编程—代码—UDP数据报传输

    UDP:数据报传输 1.接收端 public class Udps { //接收端 public static void main(String[] args) throws IOException ...

  10. tcp流式套接字和udp数据报套接字编程区别

    1. 流式套接字采用字节流方式进行传输,而数据报套接字 使用数据报形式传输数据2. tcp套接字会产生粘包,udp有消息边界,不会形成粘包.3. tcp编程可以保证消息的完整性,udp则不能保证4. ...

随机推荐

  1. C++静态数据成员实现

    静态数据成员是在一个类中用关键字static声明的数据成员.在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享.C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名 ...

  2. linux 段错误常见处理方法

    1.如果没有产生core文件,可以查询系统log 通过 sudo cat /var/log/messages |grep segfault 或者 sudo dmesg|grep segfault 获得 ...

  3. CRC-16校验原理

    最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一 ...

  4. 【Android】SDK工具学习 - adb

    ADB(Android Debug Bridge) 小白笔记 学习资料 adb简要介绍 adb 是一个 C/S 架构的命令行工具,主要由 3 部分组成: 运行在 PC 端的 Client : 可以通过 ...

  5. Oracle回收站 使用

    查询回收站 SELECT * FROM RECYCLEBIN; SELECT * FROM USER_RECYCLEBIN; --USER_RECYCLEBING与RECYCLEBIN是同义词,字段完 ...

  6. 后台导入导出Excel

    Excel导出 定义数据模型 参考财付通的批量提现Excel的格式,定义模型如下 private int recordId; //提现id private String cname; //提现人名称 ...

  7. Arcgis Desktop连接GIS Servers报错“Proxy server got bad address from remote server ...”

    今天打开Arcgis Desktop时突然发现连接GIS Servers报错“Proxy server got bad address from remote server ...” 网上查找到解决方 ...

  8. Python笔记-3

    一.文件的操作 1.文件的读.写.新增 读文件的获取句柄的语法:f=open('path/file') 句柄的理解: <_io.TextIOWrapper name='/root/myfile/ ...

  9. 剑指offer-第六章面试中的各项能力(二叉树的深度)

    题目:1:输入一个二叉树,求二叉树的深度.从根节点开始最长的路径. 思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1. 题目2:输入一颗二叉树的根节点,判断该 ...

  10. C# 报警 控制蜂鸣器发声

    在C#中可以通过以下四种方式来实现蜂鸣或者报警,播放声音之类的功能.XP下对蜂鸣有用,win7下请接上扬声器. 1). Beep的报警实现 [c-sharp] view plaincopy     / ...