1.UDP编程
socket套接字编程
1.1【socket】
1.1.1函数原型
【int socket(int domain, int type, int protocol);】
1.1.2函数功能
创建一个用来通信的文件描述符
1.1.3函数参数
【domain】:使用的协议族 AF_INET (IPv4协议族)
【type】:套接字类型【SOCK_STREAM】:流式套接字【SOCK_DGRAM】:数据报套接字【SOCK_RAW】:原始套接字
【protocol】:协议,默认为0
1.1.4返回值
【成功】:返回文件描述符
【失败】:返回【-1】
1.2【sendto】
1.2.1函数原型
【ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);】
1.2.2函数功能
利用套接字向指定地址发送数据信息
1.2.3函数参数
【sockfd】:套接字文件描述符
【buf】:发送数据空间首地址
【len】:发送数据的长度
【flags】:属性默认为0
【dest_addr】:目的地址信息存放的空间首地址
【addrlen】:目的地址的长度
struct sockaddr_in {sa_family_t sin_family;/*address family: AF_INET */in_port_t sin_port;/* port in network byte order */struct in_addr sin_addr; /* internet address */
};
struct in_addr {uint32_t s_addr; /*address in network byte order */
};
1.2.4返回值
【成功】:返回实际发送字节数
【失败】:返回【-1】
1.3【inet_addr】
1.3.1函数原型
【in_addr_t inet_addr(const char *cp);】
1.3.2函数功能
将字符串IP地址转换为内存中的IP地址
1.3.3函数参数
【cp】:
1.3.4返回值
【成功】:
【失败】:返回【-1】
1.4【htons】
1.4.1函数原型
【uint16_t htons(uint16_t hostshort);】
1.4.2函数功能
将本地字节序转换为网络的大端字节序
1.4.3函数参数
【hostshort】:
1.4.4返回值
【成功】:
【失败】:返回【-1】
源码示例:
//发送示例
int main(void)
{int sockfd = 0;struct sockaddr_in recvaddr;char tmpbuff[1024] = {"hello world"};ssize_t nsize = 0;/* 创建用来通信的UDP套接字 */sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}/* 对接收方地址赋值 */recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);//本地字节序转换为网络字节序recvaddr.sin_addr.s_addr = inet_addr("192.168.1.110");/* 发送信息 */nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr)); //接收端地址强制转换为通用类型if (-1 == nsize){perror("fail to sendto");return -1;}printf("成功发送 %ld 字节!\n", nsize);close(sockfd);return 0;
}