现在的位置: 首页 > 综合 > 正文

Linux中的UDP通信

2019年10月16日 ⁄ 综合 ⁄ 共 1780字 ⁄ 字号 评论关闭

客户端:

#include "apue.h"
#include <netdb.h>
#include <sys/socket.h>
/*
问题: UDP通信套接字描述符没有同任何地址绑定,那么在这个套接字描述符上面发送数据有什么意义 ???
是不是系统默认将其与本机地址绑定了?
答案:假如c_fd没有显式和任何本地"端口"绑定,那么内核会为其绑定一个临时"端口",
以便其可以通过该"端口"将数据发送到目的地址 !!!
>>>同Unix域套接字通信不同,这里不用显示绑定套接字和地址,服务器也能找到客户端 ~
*/
int main(void){
	int c_fd; 
	struct sockaddr_in s_addr;
	char buf[MAXLINE];
	char msg[MAXLINE];

	/* 建立UPD套接口,SOCK_DGRAM指明为UDP通信套接字 */
	if((c_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
		printf("socket error\n");

	/* 初始化服务器地址 */	
	s_addr.sin_family = AF_INET; 
	inet_pton(AF_INET,"127.0.0.1",(void *)&s_addr.sin_addr.s_addr);
	s_addr.sin_port = htons(3636); 

	/* 向服务器发送数据 */
	fgets(msg,MAXLINE,stdin);
	if(sendto(c_fd,msg,strlen(msg),0,(struct sockaddr *)&s_addr,sizeof(s_addr)) < 0)
		printf("send error\n");

	/* 接收服务器的数据,不需要关心是谁发来的 */
	if(recvfrom(c_fd,buf,MAXLINE,0,NULL,NULL) < 0)
			printf("recvfrom error\n");
	printf("server send: %s\n",buf);

	/* 关闭套接字 */
	close(c_fd);
	exit(0);
}

服务器端:

#include "apue.h"
#include <netdb.h>
#include <sys/socket.h>
#include "jiq/daemon.c"

#define BUFLINE 128
#define MAXADDRLEN 256
int main(void){
	int s_fd;
	int len;
	char buf[BUFLINE];
	struct sockaddr_in s_addr; //Linux network-addr
	struct sockaddr c_addr;
	char *msg="I Have Got your meg\n";

	/* 
		let this server become daemon 
		(1)系统自举时启动
		(2)没有控制终端
		(3)系统关闭时终止
		(4)后台运行
	*/
	daemonize("server");
	
	/* 建立UDP套接字,SOCK_DGRAM指明为UDP通信套接字 */	
	if((s_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
		printf("socket error\n");

	/* 绑定套接字和服务器网络地址 */
	s_addr.sin_family = AF_INET; 
	s_addr.sin_addr.s_addr = htonl(INADDR_ANY);//内核指定地址
	s_addr.sin_port = htons(3636); 
	if(bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr)) < 0)
		printf("bind error\n"); 

	for(;;){
		printf("\nwaiting for ask...\n");
		/* 接收数据,并记下是谁发来的 */
		if(recvfrom(s_fd,buf,BUFLINE,0,&c_addr,&len) < 0)
			printf("recvfrom error\n");

		/* 向客户端发送数据 */
		if(sendto(s_fd,msg,strlen(msg),0,&c_addr,len) < 0)
			printf("sendto error\n");

		printf("client send: %s",buf);
		memset(buf,0,MAXLINE); //clear buf
	}

 	/* 关闭套接字 */
	close(s_fd);
	exit(0);
}

抱歉!评论已关闭.