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;
}

Linux 增大udp_mem_套接字


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);

Linux 增大udp_mem_Linux 增大udp_mem_02


功能:接收UDP数据,并将源地址信息保存在from指向的结构中

参数:

• sockfd: 套接字
• buf:接收数据缓冲区
• nbytes:接收数据缓冲区的大小
• flags: 套接字标志(常为0)
• from: 源地址结构体指针,用来保存数据的来源(发送方的地址信息)
• addrlen: from所指内容的长度

注意:

• 通过from和addrlen参数存放数据来源信息
• from和addrlen可以为NULL, 表示不保存数据来源

返回值:

• 成功:接收到的字符数
• 失败: -1