Linux中的UDP通訊

小弟季義欽發表於2012-11-01

客戶端:

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

相關文章