zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/pangblog/p/3400196.html
Copyright © 2011-2022 走看看