UDP编程流程:
服务器端:socket(), bind(), recvfrom()/sendto(), close();
客户端:socket(), sendto()/recvfrom(), close();
以下是各个函数的具体介绍:
首先提一句:linux下一切皆文件,socket也不例外,它是可读、可写、可控制、可关闭的文件描述符。
创建socket
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);//创建socket
- domain 表示底层协议族。其中IPv4用PF_INET(Protocol Family of Internet),IPv6用PF_INET6。
- type 指定服务类型。服务类型主要有SOCK_STREAM(字节流服务)服务和SOCK_DGRAM服务(数据报服务)。对于TCP/IP协议族来说,SOCK_STREAM表示传输层使用TCP协议,SOCK_DGRAM表示传输层使用UDP协议。
- protocol 在前两个参数构成的协议集合下,再选择一个具体的协议。一般设置为0,表示使用默认协议。
socket()系统调用成功时返回一个socket文件描述符,失败则返回-1并设置errno。
命名(绑定)socket
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addlen);//命名(绑定)socket
bind的作用是将未命名的sockfd文件描述符指向my_addr所指的socket地址。其中socket地址长度由参数addlen指出。
bind成功时返回0,失败则返回-1并设置errno。
其中struct sockaddr是通用的socket地址,而TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用socket地址结构体,它们分别用于IPv4和IPv6,这里我们只介绍sockaddr_in: