【linux c】简单UDP应用,数据发送与接收

主要函数:

接收recvfrom()    

ssize_t  recvfrom    (int sockfd,  void *buf,  size_t len,  int flags,  struct sockaddr *src_addr,  socklen_t *addrlen);

参数说明:

 

sockfd:套接字
buf:用于接收数据的buffer
len:长度,接收数据的最大长度
flags:一般设置为0
src_addr:发送源的地址
addrlen:sizeof(src_addr)

注意:假如套接字上没有消息可以读取,且套接字没有设置为非阻塞模式(默认为阻塞模式),recvfrom会一直阻塞等待消息的到来。

 

发送sendto()

ssize_t  sendto   (int sockfd,  const void *buf,  size_t len, int flags, const struct sockaddr *dest_addr,  socklen_t addrlen);

参数说明:

 

sockfd:套接字
buf:要发送的数据buffer
len:要发送数据长度
flags:一般为0
dest_addr:发送目的地地址,IP和端口号
addrlen:sizeof(dest_addr)

 

直接上代码

 

发送端:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>         
#include <unistd.h>
#include <strings.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	//创建一个套结字
	int lfd,ret;
	lfd = socket(AF_INET,SOCK_DGRAM,0);
	
	//封装套结字地址结构
	struct sockaddr_in saddr,caddr;
	caddr.sin_family = AF_INET;
	caddr.sin_port = htons(5555);
	caddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	//绑定套结字地址到套结字描述字
	ret = bind(lfd,(struct sockaddr*)&caddr,sizeof(caddr));
	if(ret < 0)
	{
		perror("bind fail:");
		return -1;
	}
	//封装套结字地址结构
	
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(4444);
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	char buf[1024]="test udp protcol !";
	int addrlen;
	while(1)
	{
		/*一直向saddr的地址(接收端IP和端口号),发送udp包*/
		sendto(lfd,buf,1024,0,(struct sockaddr*)&saddr,sizeof(saddr));
		
		sleep(3);	
	}	
	close(lfd);
	
	return 0;
}

接收端:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>         
#include <unistd.h>
#include <strings.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	//创建一个套结字
	int lfd,ret;
	lfd = socket(AF_INET,SOCK_DGRAM,0);
	
	//封装套结字地址结构
	struct sockaddr_in saddr,caddr;
	saddr.sin_family = AF_INET;
	/*接收端端口号*/
	saddr.sin_port = htons(4444);
	/*接收端IP,此处设置为回环地址*/
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	//绑定套结字地址到套结字描述字
	ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));
	if(ret < 0)
	{
		perror("bind fail:");
		return -1;
	}
	char buf[1024];
	int addrlen;
	while(1)
	{
		bzero(buf,sizeof(buf));
		addrlen = sizeof(caddr);
		/*接收发送端发送的数据*/
		ret = recvfrom(lfd,buf,1024,0,(struct sockaddr*)&caddr,&addrlen);
		printf("%s\n",buf);
		sleep(2);
	}	
	close(lfd);
	
	return 0;
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章