1、发送数据—sendto函数
ssize_t sendto(int sockfd,const void *buf,
size_t nbytes,int flags,
const struct sockaddr *to,
socklen_t addrlen);
功能:向to结构体指针中指定的ip,发送UDP数据
参数:
- sockfd:套接字
- buf:发送数据缓冲区
- nbytes: 发送数据缓冲区的大小
- flags:一般为0
- to:指向目的主机地址结构体的指
- addrlen:to所指向内容的长度
注意:
- 通过to和addrlen确定目的地址
- 可以发送0长度的UDP数据包
返回值:
- 成功:发送数据的字符数
- 失败: -1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
unsigned short port=8080;//将16位主机字节序数据转换为网络字节序数据
unsigned char *server_ip=10.0.31.245;//字符串IP地址转换为整形数据
if(argc>1)
{
server_ip=argv[1];
}
if(argc>2)
{
port=atoi(argv[2]);
}
//创建一个用于网络通信的socket套接字
int socket_fd=socket(AF_INET,SOCK_DGRAM,0);
if(socket_fd<0)
perror("socket fild");
//填充目的server socket 地址
struct sockaddr_in dest_addr;
bzero(&dest_addr,sizeof(dest_addr));//清空内容
dest_addr.sin_family=AF_INET;//目的套接字地址的协议家族赋值
dest_addr.sin_port=htons(port);//目的套接字地址的端口号赋值
inet_pton(AF_INET,server_ip,&dest_addr.sin_addr);//...的IP地址赋值
printf("send data to UDP server %s:%d\n",server_ip,port);
//发送数据到目的server
char send_buf[512];
fgets(send_buf,sizeof(send_buf),stdin);//标准输入字符串
send_buf[strlen(send_buf)-1]='\0';//字符串最后一个'\n'变为'\0'
while(1)
{
sendto(socket_fd,send_buf,strlen(send_buf),0,(struct sockaddr*)&dest_addr,sizeof(dest_addr));
}
close(socket_fd);
return 0;
}
2、绑定bind函数
(1)UDP网络程序想要收取数据需什么条件?
- a.确定的ip地址;
- b.确定的port;
(2)怎样完成上面的条件呢?
- a.接收端 >>使用bind函数,来完成地址结构与socket套接字的绑定,这样ip、port就固定了。
- b.发送端>>在sendto函数中指定接收端的ip、port,就可以发送数据了。
bind函数
int bind(int sockfd,
const struct sockaddr *myaddr,
socklen_t addrlen);
功能:将本地协议地址与sockfd绑定
参数:
- sockfd: socket套接字
- myaddr: 指向特定协议的地址结构指针
- addrlen:该地址结构的长度
返回值:
- 成功:返回0
- 失败:其他
3、接收数据—recvfrom 函数
ssize_t recvfrom(int sockfd, void *buf,
size_t nbytes,int flags,
struct sockaddr *from,
socklen_t *addrlen);
功能:接收UDP数据,并将源地址信息保存在from指向的结构中
参数:
• sockfd: 套接字
• buf:接收数据缓冲区
• nbytes:接收数据缓冲区的大小
• flags: 套接字标志(常为0)
• from: 源地址结构体指针,用来保存数据的来源(发送方的地址信息)
• addrlen: from所指内容的长度
注意:
• 通过from和addrlen参数存放数据来源信息
• from和addrlen可以为NULL, 表示不保存数据来源
返回值:
• 成功:接收到的字符数
• 失败: -1