###########################################################
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)
原文:http://blog.csdn.net/wowotouweizi/article/details/43988967