UDP传输
UDP(User Data Protocol,用户数据报协议)是与 TCP 相对应的协议。它是属于 TCP/IP 协议族中的一种
UDP 不提供可靠性,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。Udp 传输过程相较于 TCP 传输过程,少了发起连接以及监听接收连接请求的过程。
函数
socket()
domain(协议族):
type(类型):
protocol(协议):
通常设置为0,默认
扫描二维码关注公众号,回复:
949862 查看本文章
bind():
recvfrom()
sendto()
字节序转换
uint32_t htonl(uint32_t hostlong); //把32位值从主机字节序转换成网络字节序 uint16_t htons(uint16_t hostshort);//把16位值从主机字节序转换成网络字节序 uint32_t ntohl(uint32_t netlong); //把32位值从网络字节序转换成主机字节序 uint16_t ntohs(uint16_t netshort); //把32位值从网络字节序转换成主机字节序
in_addr_t inet_addr(const char *cp);//返回网络字节序 in_addr_t inet_network(const char *cp);//返回主机字节序 char *inet_ntoa(struct in_addr in);//网络字节 ——》IP字符串 int inet_aton(const char *cp, struct in_addr *inp);//返回网络字节序
服务端示例
#include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sockfd; int ret; struct sockaddr_in server_addr; struct sockaddr_in client_addr; //创建socket套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0){ perror("socket error"); return -1; } //设置服务端信息 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(9000); server_addr.sin_addr.s_addr = inet_addr("192.168.121.128"); int len = sizeof(struct sockaddr_in); //调用bind函数,将套接字与地址信息进行绑定 ret = bind(sockfd, (struct sockaddr*)&server_addr, len); if (ret < 0){ perror("bind error"); return -1; } //服务器端不再需要监听socket,直接从绑定的地址端口上调用recvfrom函数接收数据, //并获得客户端的地址信息 char buff[1024] = {0}; while (1){ memset(buff, 0x00, 1024); ret = recvfrom(sockfd, buff, 1024, 0, (struct sockaddr*)&client_addr, &len); if (ret < 0){ continue; } printf("%s--ip:[%s], port:[%d]\n", buff, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); sleep(1); } close(sockfd); return 0; }
客户端示例
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <errno.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; //创建套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0){ perror("socket error"); return -1; } //设置服务端地址信息 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(9000); server_addr.sin_addr.s_addr = inet_addr("192.168.121.128"); char buff[1024] = {0}; int i = 0; int len = sizeof(struct sockaddr_in); while (1){ memset(buff, 0x00, 1024); sprintf(buff, "test--%d", i++); //调用sendto函数向指定地址发送数据 sendto(sockfd, buff, 1024, 0, (struct sockaddr*)&server_addr, len); sleep(1); } close(sockfd); return 0; }