uid_sock.c
上传用户:allwinjm
上传日期:2021-08-29
资源大小:99k
文件大小:5k
源码类别:

Internet/IE编程

开发平台:

Unix_Linux

  1. /************************************************************************ 
  2.  * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 
  3.  * Copyright (C) 2001-2003 Optical Access 
  4.  * Author: Alex Rozin 
  5.  * 
  6.  * This file is part of RSTP library. 
  7.  * 
  8.  * RSTP library is free software; you can redistribute it and/or modify it 
  9.  * under the terms of the GNU Lesser General Public License as published by the 
  10.  * Free Software Foundation; version 2.1 
  11.  * 
  12.  * RSTP library is distributed in the hope that it will be useful, but 
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser 
  15.  * General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public License 
  18.  * along with RSTP library; see the file COPYING.  If not, write to the Free 
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  20.  * 02111-1307, USA. 
  21.  **********************************************************************/
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <errno.h>
  26. #include <sys/time.h>
  27. #include <unistd.h>
  28. #include "uid_sock.h"
  29. static int Socket(int family, int type, int protocol)
  30. {
  31.   int sock_fd;
  32.   sock_fd = socket(family, type, protocol);
  33.   if (sock_fd < 0) {
  34.     return -1;
  35.   }
  36.   return sock_fd;
  37. }
  38. #define UID_SET_SOCKET_ID(SPTR, X)
  39. strncpy((SPTR)->socket_id, (X),SOCKET_NAME_LENGTH); 
  40.         (SPTR)->socket_id[SOCKET_NAME_LENGTH - 1] = '';
  41. #define UID_SET_SOCKET_SERVER_ID(SPTR, X)
  42. (SPTR)->serverAddr.sun_path[0] = '';
  43. strncpy((SPTR)->serverAddr.sun_path + 1, (X),SOCKET_NAME_LENGTH - 1);
  44.         (SPTR)->serverAddr.sun_path[SOCKET_NAME_LENGTH - 1] = '';
  45. #define UID_SET_SOCKET_CLIENT_ID(SPTR, X)       
  46. (SPTR)->clientAddr.sun_path[0] = '';
  47. strncpy((SPTR)->clientAddr.sun_path + 1, (X),SOCKET_NAME_LENGTH - 1); 
  48.         (SPTR)->clientAddr.sun_path[SOCKET_NAME_LENGTH - 1] = '';
  49. int
  50. UiD_SocketCompare (UID_SOCKET_T* s, UID_SOCKET_T* t)
  51. {
  52.   register char* ps;
  53.   register char* pt;
  54.   ps = s->clientAddr.sun_path;
  55.   if (! *ps) ps++;
  56.   if (! *ps) return 1;
  57.   pt = t->clientAddr.sun_path;
  58.   if (! *pt) pt++;
  59.   if (! *pt) return 2;
  60.   if (strcmp (pt, ps))
  61.     return 3;
  62.   else {
  63.     return 0;
  64.   }
  65. }
  66. int UiD_SocketInit(UID_SOCKET_T* s,
  67.                       UID_SOCK_ID socket_id,
  68.                       TYPE_OF_BINDING binding)
  69. {
  70.   bzero(s, sizeof (UID_SOCKET_T));
  71.   s->sock_fd = Socket(AF_LOCAL, SOCK_DGRAM, 0);
  72.   s->clientAddr.sun_family = AF_LOCAL;
  73.   s->serverAddr.sun_family = AF_LOCAL;
  74.   
  75.   switch (binding) {
  76.     case UID_BIND_AS_CLIENT:
  77.       strncpy (s->socket_id, tmpnam(NULL),SOCKET_NAME_LENGTH );
  78.       UID_SET_SOCKET_CLIENT_ID(s,s->socket_id );      
  79.       if (bind(s->sock_fd, (SA *)&(s->clientAddr), SIZE_OF_ADDRESS) < 0) {
  80. return -2;
  81.       }
  82.       bzero(&s->serverAddr, SIZE_OF_ADDRESS);
  83.       s->serverAddr.sun_family = AF_LOCAL;
  84.       UID_SET_SOCKET_SERVER_ID(s, socket_id);
  85.       break;
  86.     case UID_BIND_AS_SERVER:
  87.       unlink(socket_id);
  88.       strncpy (s->socket_id, socket_id, SOCKET_NAME_LENGTH);
  89.       UID_SET_SOCKET_SERVER_ID(s,s->socket_id);
  90.       
  91.       if (bind(s->sock_fd, (SA *)&(s->serverAddr), SIZE_OF_ADDRESS) < 0) {
  92.          perror ("Error:");
  93.          fflush (stdout);
  94.          return -4;
  95.       }
  96.       break;
  97.     default:
  98.       return -5;
  99.   }
  100.   s->binding = binding;
  101.   return 0;
  102. }
  103. int UiD_SocketRecvfrom (UID_SOCKET_T* sock,
  104.                         void* msg, int buffer_size,
  105.                         UID_SOCKET_T* sock_4_reply)
  106. {
  107.   int size;
  108.   socklen_t len = SIZE_OF_ADDRESS;
  109.   while (1) {
  110.       size = recvfrom(sock->sock_fd, msg, buffer_size, 0,
  111.                   (struct sockaddr *)(((UID_BIND_AS_CLIENT == sock->binding) || !sock_4_reply) ?
  112.                      NULL : &(sock_4_reply->clientAddr)),
  113.                   (UID_BIND_AS_CLIENT == (sock->binding)) ?
  114.                      NULL : &len);
  115.       if (size < 0 && errno == EINTR) continue;
  116.       break;
  117.   }
  118.   if ((UID_BIND_AS_CLIENT != sock->binding) && sock_4_reply) {
  119.     sock_4_reply->sock_fd = sock->sock_fd;
  120.     sock_4_reply->binding = UID_BIND_AS_SERVER;
  121.   }
  122.   return size;
  123. }
  124. int UiD_SocketSendto (UID_SOCKET_T* sock, void* msg, int msg_size)
  125. {
  126.   int rc, size = 0;
  127.   while (size != msg_size) {
  128.      rc  = sendto (sock->sock_fd, (msg+size), (msg_size-size), 0,
  129.                   (struct sockaddr *)((UID_BIND_AS_CLIENT == sock->binding) ? &sock->serverAddr : &sock->clientAddr),
  130.                   SIZE_OF_ADDRESS);
  131.      
  132.      if (rc < 0) {
  133.         if (errno == EINTR) {
  134.           continue;
  135.         } else {
  136.           return -1; 
  137.         }
  138.      }
  139.      size += rc;
  140.   }
  141.   return 0;
  142. }
  143. int UiD_SocketClose(UID_SOCKET_T* s)
  144. {
  145.   close (s->sock_fd);
  146.   return 0;
  147. }
  148. int UiD_SocketSetReadTimeout (UID_SOCKET_T* s, int timeout)
  149. {
  150.   int retval = -1;
  151.   struct timeval wait;
  152.   fd_set read_mask;
  153.   wait.tv_sec = timeout;
  154.   wait.tv_usec = 0;
  155.   FD_ZERO(&read_mask);
  156.   FD_SET(s->sock_fd, &read_mask);
  157.   retval = select (s->sock_fd + 1, &read_mask, NULL, NULL, &wait);
  158.   if (retval < 0) { // Error
  159.     fprintf (stderr, "UiD_SocketSetReadTimeout failed: %sn", strerror(errno));
  160.     return 0;
  161.   } else if (! retval) { // Timeout expired
  162.     return 0;
  163.   } else { // 0
  164.     ;
  165.   }
  166.   return retval;
  167. }