Linux中的UDP通信

来源:互联网 发布:淘宝美食推荐 编辑:程序博客网 时间:2024/05/28 15:06

客户端:

#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 256int main(void){int s_fd;int len;char buf[BUFLINE];struct sockaddr_in s_addr; //Linux network-addrstruct 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);}
原创粉丝点击