UDP传输
UDP(User Data Protocol,用户数据报协议)是与 TCP 相对应的协议。它是属于 TCP/IP 协议族中的一种
UDP 不提供可靠性,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。Udp 传输过程相较于 TCP 传输过程,少了发起连接以及监听接收连接请求的过程。
函数
socket()

domain(协议族):

type(类型):

protocol(协议):
通常设置为0,默认
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;
}

351

被折叠的 条评论
为什么被折叠?



