sockets: UDP

###########################################################

UDP套接字编程相关的系统调用(内核中的传输层)

######################################################

大多数UDP服务器都是迭代的。UDP没有流量控制并且是不可靠的。

用socket函数来获取一个未命名套接字,返回一个套接字描述符:

int socket(int family, int type, int protocol);

family:(网络层协议)

分两种,一般用地址族。

bsd和linux:(AF:地址族)

AF_INET(ipv4域)

AF_INET6(ipv6域)

AF_LOCAL(unix域)=AF_UNIX

AF_ROUTE(路由域)

AF_KEY(秘钥域)

AF_PACKET

svr4:(PF:协议族)

PF_INET

PF_INET6

PF_UNIX

PF_NCA

type:

SOCK_STREAM(字节流套接字)(tcp、sctp)

SOCK_DGRAM(数据报套接字)(udp)

SOCK_SEQPACKET(有序分组套接字)(sctp)

SOCK_RAW(原始套接字)(ipv4、ipv6)

SOCK_RDM(无序可靠数据报套接字)

protocol:(传输层协议)

0:tcp和udp,一般用这个,表示默认值

IPPROTO_SCTP: sctp用这个。

调用bind函数把一个地址和端口赋予一个套接字(给套接字命名):

在建立连接之前如果没有调用bind,内核会选择一个IP和端口号给套接字。

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrltn);

sockfd:socket()返回的套接字描述符

struct sockaddr:ipv4通用套接字地址结构

addrlen:结构的长度,sizeof(struct sockaddr)

如果为通配地址且为INADDR_ANY=0,表示bind时由内核选择IP;

如果用指定的本地IP,就用指定的IP。

如果端口号为0,表示bind时由内核选择端口号;

如果端口号不为0,就用指定的端口。

未连接UDP套接字收发数据(默认的UDP都是未连接):

ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,const struct sockaddr *to, socklen_t addrlen);

考虑超时问题

类似于write,从buff写入nbytes到sockfd。

to:指向一个含有数据报接收者的协议地址的通用套接字地址结构,大小由整数addrlen指定。类似于connect的最后两个参数。最后一个参数不是指针。

也就是接收方的通用套接字地址结构和长度,必须填写。

ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, structsockaddr *from, socklen_t *addrlen);

考虑超时问题

类似于read,从sockfd读入nbytes到buff。

from:指向一个由该函数在返回时填写的数据报发送者的协议地址的通用套接字地址结构,该结构的字节数放在指针addrlen指向的整数中返回给调用者。类似于accept的最后两个参数。注意最后一个参数是指针。

也就是发送方的通用套接字地址结构和长度,不需要获取可以忽略。

flag:不用可以置为0.

---------------------------------------

已连接UDP套接字收发数据:(使用connect建立连接的数据)

客户用connect函数建立客户端的未命名套接字和服务监听套接字的连接:

考虑超时问题

int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen);

sockfd:socket()返回的套接字描述符

struct sockaddr:通用套接字地址结构

addrlen:结构的长度

后两个参数就是服务器的通用套接字地址结构和长度,必须填写。

需要用connect指定IP地址和端口号,而且只与这个IP和端口建立连接,其他的都不能通信。

发送:

write

send

sendmsg

sendto(不指定IP和端口号)

接收:

read

recv

recvmsg

recvfrom(不指定IP和端口号)

已连接UDP套接字的异步错误会返回给所在的进程,未连接的不会返回异步错误。

已连接的UDP可以再次调用connect:

可以指定新的IP和端口;

可以断开连接(AF_UNSPEC)

时间: 2024-12-19 14:54:54

sockets: UDP的相关文章

[C# 网络编程系列]专题六:UDP编程

转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的)底层的传输基础,所以在本专题中就简单介绍下UDP的工作原理和UDP编程的只是,希望可以对刚接触网络编程的朋友起到入门的作用. 一.UDP介绍 UDP和TCP都是构建在IP层

传输层:UDP协议

传输层:UDP 协议 一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地讲,通信双方不是主机,而是主机中的进程.主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在于 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信.两个主机的传输层

4高并发服务器:UDP局域网服务器(组播)

 1 UDP局域网服务器 A读出每一个客户端发送过来的数据包,然后fork出子进程,由子进程去处理客户端请求. B客户端与服务器段交换多个数据报,服务器为每一个客户端连接创建新的socket,在其上bind一个临时端口,然后用该socket处理对应客户端上的所有应答,这个办法要求在客户查看服务器第一个应答中的源端口号.然后后面利用此端口号和服务器进行交互. 2函数声明 int bind(int sockfd, const struct sockaddr*addr,socklen_t addr

传输层:UDP 协议

一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地讲,通信双方不是主机,而是主机中的进程. 主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在与 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信. 两个主机的传输层之间有一个灰色双向

Linux学习四:UDP编程(上)

关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些控制. 二者函数调用唯一的实际区别是soceket函数调用的一个参数,TCP的是SOCK_STREAM,UDP的是SOCK_DGRAM,二者都可以使用recvfrom函数,而recv只用于TCP. 当然函数的变化不是这么简单,因为你要从一种有连接的协议转向到无连接的协议上去.这里写个很简单直接的UD

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数: socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数: socket();      recfrom();  sendto();  closesocket(); 二.具体代码如下所示,欢迎大家一起交流 首先要打开服务器进行监听,所以服务器server代码如下: // udpse.cpp : Defines the en

在php中使用sockets:从新闻组中获取文章

PHP能打开远程或本地主机上的Socket端口.本文是一个使用Socket的小例子:连 接到一个Usenet新闻组服务器,同服务器对话,从新闻组中下载一些文章.在php中打开一个socket 使用fsockopen()打开一个socket.这个函数在php3和php4种都可以使用.函数声明 是这样的: int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout]]])这个函数将打

移动端IM系统的协议选型:UDP还是TCP?

1.前言 对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码该如何编写. 从PC时代的IM开始,IM开发者就在为数据传输协议的选型争论不休(比如:<为什么QQ用的是UDP协议而不是TCP协议?>这样的问题,隔一段时间就能在社区里看到).到了移动互联网时代,鉴于移动网络的不可靠性等特点,再加上手机的省电策略.流量压缩等,为这个问题的回答增了更多的不确定因素. 对于有选择困难证的人来说,基于以上因素,加上UDP和TCP协议的本质差异

Android(java)学习笔记80:UDP协议发送数据

UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 /* 8 * UDP协议发送数据: 9 * A:创建发送端Socket对象 10 * B:创建数据,并把数据打包 11 *