udp.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*----------------------------------------------------------------------*
  2.   udp.c                                                 
  3.   
  4.   Version:     1.0   10/97
  5.                1.1   4/99 - tweaked for use in tpjack software
  6.                1.2   6/10/99 - changed the license to LGPL
  7.   
  8.   This module provides functions to use that read and write UDP
  9.   packets to and from the network.  
  10.   Copyright (c) 1999 Quicknet Technologies, Inc.
  11.   Written by Greg Herlein <gherlein@quicknet.net> - donated to 
  12.   Quicknet 6/10/99 by Herlein Engineering.
  13.  * This is free software; you can redistribute it and/or
  14.  * modify it under the terms of the GNU Lesser General Public
  15.  * License (LGPL) as published by the Free Software Foundation; either
  16.  * version 2 of the License, or (at your option) any later version.
  17.  *
  18.  * This software is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  21.  * General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU Lesser General Public
  24.  * License along with this library; if not, write to the
  25.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  26.  * Boston, MA 02111-1307, USA.  It is also available online at 
  27.  * http://www.gnu.org/copyleft/lesser.html
  28.  
  29. ----------------------------------------------------------------------*/
  30. /*-------------------------------< RCS >--------------------------------*/
  31. static char RCS_ID[] = "$Id: udp.c,v 1.1.1.1 1999/07/16 01:26:02 bogawa Exp $";
  32. /*----------------------------< Defines >-------------------------------*/
  33. /*----------------------------< Includes >------------------------------*/
  34. /* stdlib */
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <unistd.h>
  38. #include <string.h>
  39. #include <time.h>
  40. #include <arpa/inet.h>
  41. #include <netinet/in.h>
  42. #include <sys/types.h>
  43. #include <sys/wait.h>
  44. #include <sys/socket.h>
  45. #include <netdb.h>
  46. #include <errno.h>
  47. #include <fcntl.h> 
  48. /* other lib  */
  49. #include "udp.h"
  50. /*---------------------------< Definitions >----------------------------*/
  51. /*--------------------------< Declarations >----------------------------*/
  52. /*------------------------< Global Variables >--------------------------*/
  53. char                                szClientName[50];
  54. char                                szClientAddr[50];
  55. /*-------------------------< Local Variables >--------------------------*/
  56. static struct sockaddr_in           their_addr;        
  57. static int                          their_addr_len;
  58. static struct sockaddr_in           my_addr; 
  59. static int                          my_addr_len;
  60. /*----------------------------------------------------------------------*/
  61. int
  62. GetSendSocket(char *host,int nPort)
  63. {
  64.   int                          n=0,on=1,nSock=-1,s,type;
  65. struct hostent*              pHost;
  66.   their_addr_len = sizeof(struct sockaddr);
  67. bzero((char *)&their_addr,their_addr_len);
  68. their_addr.sin_family=AF_INET;
  69.   /* first see if host is already a dotted decimal address */
  70.   their_addr.sin_addr.s_addr=inet_addr(host);
  71.   if(their_addr.sin_addr.s_addr==-1)
  72.   {
  73.     /* see if we can resolve it as a hostname via bind */
  74.     if((pHost=gethostbyname(host)) == NULL)
  75.     {
  76.       switch(h_errno)
  77.       {
  78.         case HOST_NOT_FOUND:
  79.           printf("gethostbyname() failed - HOST_NOT_FOUND (h_errno=%d)",
  80.                  h_errno);
  81.           break;
  82.         case NO_ADDRESS:
  83.           printf("gethostbyname() failed - NO_ADDRESS (h_errno=%d)",h_errno);
  84.           break;
  85.         case NO_RECOVERY:
  86.           printf("gethostbyname() failed - NO_RECOVERY (h_errno=%d)",h_errno);
  87.           break;
  88.         case TRY_AGAIN:
  89.           printf("gethostbyname() failed - TRY_AGAIN (h_errno=%d)",h_errno);
  90.           break;
  91.         default:
  92.           printf("gethostbyname() failed -  %s (errno=%d)",strerror(errno),
  93.                  errno);
  94.           break;
  95.       }
  96.       return -1;
  97.     } else
  98.     {
  99.       memcpy(&their_addr.sin_addr.s_addr,pHost->h_addr,pHost->h_length);
  100.       their_addr.sin_port = htons(nPort);
  101.     } /* end if((pHost= ... */
  102.   } else
  103.   {
  104.     their_addr.sin_port = htons(nPort);
  105.   }    
  106.   /* create a datagram socket */
  107.   if ((nSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  108.   {
  109.     perror("sock: ");
  110.     return -1;
  111.   }
  112.   /* bind that port to this porocess */
  113.   if(connect(nSock,(struct sockaddr *)&their_addr,their_addr_len)==-1) {
  114.     perror("bind");
  115.     return -1;
  116.   }
  117.  
  118.   /* zero the rest of the struct */  
  119.   bzero(&(their_addr.sin_zero), 8);
  120.   return nSock;
  121.   /* make it non-blocking */
  122.   fcntl(nSock,F_SETFL,O_NONBLOCK);
  123. }
  124. /*----------------------------------------------------------------------*/
  125. int
  126. GetRecvSocket(int nPort)
  127. {
  128.   int                  nSock;
  129.   int                  n;
  130.   if ((nSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  131.     perror("socket: ");
  132.     return -1;
  133.   }
  134.   my_addr.sin_family = AF_INET;         /* host byte order */
  135.   my_addr.sin_port = htons(nPort);      /* short, network byte order */
  136.   my_addr.sin_addr.s_addr = INADDR_ANY; /* automatically fill with my IP */
  137.   bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */
  138.   my_addr_len = sizeof(struct sockaddr);
  139.   /* bind that port to this porocess */
  140.   if(bind(nSock,(struct sockaddr *)&my_addr,my_addr_len)==-1) {
  141.     perror("bind");
  142.     return -1;
  143.   }
  144.   /* make it non-blocking */
  145.   fcntl(nSock,F_SETFL,O_NONBLOCK);
  146.   return nSock;
  147. }
  148. /*----------------------------------------------------------------------*/
  149. int
  150. CloseSocket(int nSock)
  151. {
  152.   close(nSock);
  153.   return 1;
  154. }
  155. /*----------------------------------------------------------------------*/
  156. int
  157. ReadUDP(int nSock,char* pBuf,int nLen)
  158. {
  159.   /* reads the UDP packet that has arrived and places 
  160.      the incoming string into pBuf.  Reads at most nLen bytes  
  161.      essentially, this encapsulates recvfrom to look like read
  162.      Returns -1 on error, number of bytes read on success  */
  163.   int          n=0;
  164.   
  165.   if((n=recvfrom(nSock,pBuf,nLen,0,(struct sockaddr *)&their_addr,
  166.  &their_addr_len)) == -1) {
  167. //    perror("recvfrom");
  168.     return -1;
  169.   }
  170.   return n;
  171. }
  172. /*----------------------------------------------------------------------*/
  173. int
  174. IdentifyPeer(int nSock)
  175. {
  176.   struct sockaddr_in  sPeer;
  177.   int                 nSize,n;
  178.   char*               p;
  179.   /* get the name and address of the client */
  180.   nSize=sizeof(sPeer);
  181.   n=getpeername(nSock,(struct sockaddr*)&sPeer,&nSize);
  182.   if(n==-1) {
  183.     printf("Unable to get peer name infon");
  184.     return -1;
  185.   }
  186.   p=inet_ntoa(sPeer.sin_addr);
  187.   strncpy(szClientAddr,p,sizeof(szClientAddr));
  188.   GetNameFromAddr(szClientAddr,szClientName,sizeof(szClientName));
  189.   return 1;
  190. }
  191. /*----------------------------------------------------------------------*/
  192. int
  193. GetNameFromAddr(char* szIP, char* szName, int nLenName)
  194. {
  195.   struct sockaddr_in  sPeer;
  196.   int                 n;
  197.   struct hostent*     pHe;
  198.   /* get the name and address of the IP address passed in */
  199.   n=inet_aton(szIP,&sPeer.sin_addr);
  200.   if ((pHe=gethostbyaddr((char*)&sPeer.sin_addr,sizeof(sPeer.sin_addr),
  201.        AF_INET)) == NULL) { 
  202.      printf("Unable to get peer address infon");
  203.      return -1;
  204.   }
  205.   memset(szName,0x00,nLenName);
  206.   strncpy(szName,pHe->h_name,nLenName-1);
  207.   return 1;
  208. }
  209. /*----------------------------------------------------------------------*/
  210. /*-------------------------------< End >--------------------------------*/