• UDP套接字——(DGRAM)


    /*********************程序相关信息*********************
     * 程序编号:014
     * 程序编写起始日期:2013.11.29
     * 程序编写完成日期:2013.11.29
     * 程序修改日期:                                    修改备注:
     * 程序目的:学习linux UDP( DGRAM) 
     * 所用主要函数:socket() bind() recvfrom() sendto()	
     * 程序说明:
     * 程序完成地点: 
     * *********************程序相关信息*********************/
    #include <sys/types.h>
    #include <netinet/in.h>
    #include  <netinet/ip.h>
    #include <sys/socket.h>
    
    #include <stdio.h>
    
    #define BUFSIZE 1500
    
    int main(void)
    {
    	int sd;
    	struct sockaddr_in myend, hisend;
    	socklen_t hislen;
    	int ret;
    	char buf[BUFSIZE];
    
    	sd = socket(PF_INET, SOCK_DGRAM, 0);
    	if (sd == -1) {
    		perror("socket()");
    		goto socket_err;
    	}
    //int bind(int sockfd, struct sockaddr *my_addr, int addrlen) 
    //sockfd:是由socket调用返回的文件描述符. 
    //addrlen:是sockaddr结构的长度. 
    //my_addr:是一个指向sockaddr的指针. 在<linux/socket.h>中有 sockaddr的定义 
    //struct sockaddr{ 
    //unisgned short as_family; 
    //char sa_data[14]; 
    //}; 
    //不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sock 
    //addr_in) 来代替.在<linux/in.h>中有sockaddr_in的定义 
    //struct sockaddr_in{
    //unsigned short sin_family; 
    //unsigned short int sin_port; 
    //struct in_addr sin_addr; 
    //unsigned char sin_zero[8]; 
    //我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表 
    //示可以 和任何的主机通信,sin_port是我们要监听的端口号.sin_zero[8]是用来填充的 
    //.. bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和 
    //socket一样 
    	myend.sin_family = AF_INET;
    	myend.sin_port = htons(8899);
    //i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反. 为了统一起来,在Li 
    //nux下面,有专门的字节转换函数. 
    //unsigned long int htonl(unsigned long int hostlong) 
    //unsigned short int htons(unisgned short int hostshort) 
    //unsigned long int ntohl(unsigned long int netlong) 
    //unsigned short int ntohs(unsigned short int netshort) 
    //在这四个转换函数中,h 代表host, n 代表 network.s 代表short l 代表long 第一个函 
    //数的意义是将本机器上的long数据转化为网络上的long. 其他几个函数的意义也差不多 
    //
    	myend.sin_addr.s_addr = INADDR_ANY; // man 7 ip
    	ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend));
    	if (ret == -1) {
    		perror("bind()");
    		goto bind_err;
    	}
    
    	hislen = sizeof(hisend);//??
    	while (1) {
    //int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct socka 
    //ddr * from int *fromlen) 
    //int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct s 
    //ockaddr *to int tolen) 
    //sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发送或接收的缓冲区 
    //及大小.recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息 
    //来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL.sendto负责 
    //向to发送信息.此时在to里面存储了收信息方的详细资料. 
    		ret = recvfrom(sd, buf, BUFSIZE, 0, (struct sockaddr *)&hisend, &hislen);
    		/* if error */
    
    		write(1, buf, ret);
    
    		sendto(sd, "xxxxxx
    ", 7, 0, (struct sockaddr *)&hisend, hislen);
    	}
    
    	close(sd);
    
    	return 0;
    
    
    
    bind_err:
    	close(sd);
    socket_err:
    	return 1;
    }
    #include <sys/types.h>
    #include <netinet/in.h>
    #include  <netinet/ip.h>
    #include <sys/socket.h>
    
    #include <stdio.h>
    
    #define BUFSIZE 1500
    
    int main(void)
    {
    	int sd;
    	struct sockaddr_in myend, hisend;
    	socklen_t hislen;
    	int ret;
    	char buf[BUFSIZE];
    
    	sd = socket(PF_INET, SOCK_DGRAM, 0);
    	if (sd == -1) {
    		perror("socket()");
    		goto socket_err;
    	}
    
    	hisend.sin_family = AF_INET;
    	hisend.sin_port = htons(8899);
    //  int inet_pton(int af, const char *src, void *dst);
    	
    	inet_pton(AF_INET, "192.168.1.111", &hisend.sin_addr);
    // This  function converts the character string src into a network address
    // structure in the af address family, then  copies  the  network  address
    //structure to dst.
    //
    #if 0
    	ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend));
    	if (ret == -1) {
    		perror("bind()");
    		goto bind_err;
    	}
    #endif
    
    	hislen = sizeof(hisend);
    	while (1) {
    		ret = read(0, buf, BUFSIZE);
    		/* if error */
    		if (ret == 0) {
    			break;
    		}
    // ssize_t  sendto(int  s,  const  void *buf, size_t len, int flags, const
    //struct sockaddr *to, socklen_t tolen);
    //Send, sendto, 和 sendmsg 用于向另一个套接字传递消息. Send 仅仅用于连接套接字,而 sendto 和 sendmsg
    //可用于任何情况下.
    //
    //目标地址用 to 指定, tolen 定义其长度.消息的长度用 len 指定.
    //如果消息太长不能通过下层协议,函数将返回 EMSGSIZE 错误,消息也不会被送出. 
    		sendto(sd, buf, ret, 0, (struct sockaddr *)&hisend, hislen);
    //ssize_t recvfrom(int s, void *buf, size_t len, int flags,
    // struct sockaddr *from, socklen_t *fromlen)
    		ret = recvfrom(sd, buf, BUFSIZE, 0, (struct sockaddr *)&hisend, &hislen);
    		/* if error */
    
    		write(1, buf, ret);
    	}
    
    	close(sd);
    
    	return 0;
    
    
    
    bind_err:
    	close(sd);
    socket_err:
    	return 1;
    }


  • 相关阅读:
    Nosql database
    NoSQL
    nodejs and db
    Nodejs and json
    Nodejs异步
    HTTP-304 NOT Modified
    Origin null is not allowed by Access-Control-Allow-Origin
    nodejs MVC
    solr 亿万级数据查询性能測试
    iOS8 对开发人员来说意味着什么?
  • 原文地址:https://www.cnblogs.com/pangblog/p/3400196.html
Copyright © 2020-2023  润新知