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

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