本文共 5571 字,大约阅读时间需要 18 分钟。
目录
三、
1、 是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况: 适合于对传输质量要求较高,以及传输大量数据的通信。 在需要可靠数据传输的场合,通常使用TCP协议 MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议1、是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
适用情况: 发送小尺寸数据(如对DNS服务器进行IP地址查询时) 在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络) 适合于广播/组播式通信中。 MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输IP地址是Internet中主机的标识
Internet中的主机要与别的机器通信必须具有一个IP地址 IP地址为32位(IPv4)或者128位(IPv6) 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
小端序
低序字节存储在低地址将低字节存储在起始地址 大端序 高序字节存储在低地址主机字节序到网络字节序
u_long htonl (u_long hostlong); u_short htons (u_short short); 网络字节序到主机字节序 u_long ntohl (u_long hostlong); u_short ntohs (u_short short);inet_aton
int inet_aton(const char *cp, struct in_addr *inp); 将cp所指c字符串转换成一个32位的网络字节序二进制值,并通过指针inp来储存,若成功值返回1,否则返回0 in_addr_t inet_addr(const char *cp);进行相同的转换 inet_ntoa char *inet_ntoa(struct in_addr in);inet_pton
int inet_pton(int af, const char *src, void *dst); af参数既可以是AF_INET,也可以是AF_INET6 这个函数转换字符串到网络地址,第一个参数是地址族,转换后存在dst中,inet_pton是inet_addr的扩展 inet_ntop const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 这个函数转换网络二进制结构到ASCLL类型的地址,参数的作用和上面相同,只是多了一个socklen_t 出纳台,它是所指向 缓存区dst的大小,避免溢出,int socket(int domain, int type, int protocol); int domain家族协议(IPV4----AF_INET,IPV6---AF_INET6 ) int type套接字类型(TCP----SOCK_STREAM,UDP-----SOCK_DGRAM) int protocol 默认0 返回值:成功返回套接字描述符,失败返回-1
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); int sockfd套接字描述符 const struct sockaddr *addr服务器地址,端口号(struct sockaddr_in)--》 在/usr/include/linux/in.h 有该结构体说明 socklen_t addrlen地址长度
int listen(int sockfd, int backlog); sockfd:套接字描述符 backlog:监听个数 返回值:成功0, 失败-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); int sockfd服务器套接字描述符 struct sockaddr *addr保存客户端信号 socklen_t *addrlen保存客户端信息长度 返回值:成功新的套接字描述符,失败-1
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); int sockfd服务器套接字描述符 struct sockaddr *addr连接的服务器地址信息 socklen_t *addrlen地址信息长度
int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const char *cp); in_addr_t inet_network(const char *cp); char *inet_ntoa(struct in_addr in); struct in_addr inet_makeaddr(int net, int host); in_addr_t inet_lnaof(struct in_addr in); in_addr_t inet_netof(struct in_addr in)
1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)
2.往指定的地址发送数据(ip,端口号)sendtossize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); int sockfd套接字 const void *buf要发送的数据 size_t len发送数据的长度 int flags默认为0 const struct sockaddr *dest_addr发送到地址 socklen_t addrlen地址的长度 返回值:成功发送的字节数
1.创建套接字socket
2.绑定地址、端口号bind 3.接收数据recvfromssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); sockfd:标识一个已连接套接口的描述字 buf:接收数据缓冲区 len:缓冲区长度 flags:调用操作方式 src_addr:(可选)指针,指向装有源地址的缓冲区 addrlen::(可选)指针,指向from缓冲区长度值
1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)
2.设置socket广播属性int on = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
3.往指定的地址发送数据(ip,端口号)sendto
size_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); int sockfd套接字 const void *buf要发送的数据 size_t len发送数据的长度 int flags默认为0 const struct sockaddr *dest_addr发送到地址(广播地址192.168.1.255) socklen_t addrlen地址的长度 返回值:成功发送的字节数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)
2.往指定的地址发送数据(ip,端口号)sendto (地址224.0.0.0--224.0.0.255)ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)
2.绑定地址、端口号bind 3.加入组播组struct ip_mreq mreqmreq.imr_multiaddr.s_addr = inet_addr("224.0.0.100");mreq.imr_interface.s_addr = INADDR_ANY;setsockopt(套接字描述符, 层级别(网络层SOL_IP),添加/退出(命令), &mreq, mreq结构体长度); 添加IP_ADD_MEMBERSHIP 退出IP_DROP_MEMBERSHIP
4.接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
转载地址:http://bezwi.baihongyu.com/