Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

vmdsock.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr
00003  *cr            (C) Copyright 1995-2008 The Board of Trustees of the
00004  *cr                        University of Illinois
00005  *cr                         All Rights Reserved
00006  *cr
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: vmdsock.c,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.19 $      $Date: 2008/03/27 19:36:52 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *   Socket interface, abstracts machine dependent APIs/routines. 
00019  ***************************************************************************/
00020 
00021 #define VMDSOCKINTERNAL 1
00022 
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <string.h>
00026 
00027 #if defined(_MSC_VER) 
00028 #include <winsock2.h>
00029 #else
00030 #include <arpa/inet.h>
00031 #include <fcntl.h>
00032 
00033 #include <sys/types.h>
00034 #include <unistd.h>   /* for Linux */
00035 #include <sys/socket.h>
00036 #include <netdb.h>
00037 #endif
00038 
00039 #include <errno.h>
00040 
00041 #include "vmdsock.h"
00042 
00043 int vmdsock_init(void) {
00044 #if defined(_MSC_VER)
00045   int rc = 0;
00046   static int initialized=0;
00047 
00048   if (!initialized) {
00049     WSADATA wsdata;
00050     rc = WSAStartup(MAKEWORD(1,1), &wsdata);
00051     if (rc == 0)
00052       initialized = 1;
00053   }
00054 
00055   return rc;
00056 #else   
00057   return 0;
00058 #endif
00059 }
00060 
00061 
00062 void * vmdsock_create(void) {
00063   vmdsocket * s;
00064 
00065   s = (vmdsocket *) malloc(sizeof(vmdsocket));
00066   if (s != NULL)
00067     memset(s, 0, sizeof(vmdsocket)); 
00068 
00069   if ((s->sd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
00070     printf("Failed to open socket.");
00071     free(s);
00072     return NULL;
00073   }
00074 
00075   return (void *) s;
00076 }
00077 
00078 int  vmdsock_connect(void *v, const char *host, int port) {
00079   vmdsocket *s = (vmdsocket *) v;
00080   char address[1030];
00081   struct hostent *h;
00082 
00083   h=gethostbyname(host);
00084   if (h == NULL) 
00085     return -1;
00086   sprintf(address, "%d.%d.%d.%d",
00087     (unsigned char) h->h_addr_list[0][0],
00088     (unsigned char) h->h_addr_list[0][1],
00089     (unsigned char) h->h_addr_list[0][2],
00090     (unsigned char) h->h_addr_list[0][3]);
00091 
00092   memset(&(s->addr), 0, sizeof(s->addr)); 
00093   s->addr.sin_family = PF_INET;
00094   s->addr.sin_addr.s_addr = inet_addr(address);
00095   s->addr.sin_port = htons(port);  
00096 
00097   return connect(s->sd, (struct sockaddr *) &s->addr, sizeof(s->addr)); 
00098 }
00099 
00100 int vmdsock_bind(void * v, int port) {
00101   vmdsocket *s = (vmdsocket *) v;
00102   memset(&(s->addr), 0, sizeof(s->addr)); 
00103   s->addr.sin_family = PF_INET;
00104   s->addr.sin_port = htons(port);
00105 
00106   return bind(s->sd, (struct sockaddr *) &s->addr, sizeof(s->addr));
00107 }
00108 
00109 int vmdsock_listen(void * v) {
00110   vmdsocket *s = (vmdsocket *) v;
00111   return listen(s->sd, 5);
00112 }
00113 
00114 void *vmdsock_accept(void * v) {
00115   int rc;
00116   vmdsocket *new_s = NULL, *s = (vmdsocket *) v;
00117 #if defined(ARCH_AIX5) || defined(ARCH_AIX5_64)
00118   unsigned int len;
00119 #elif defined(SOCKLEN_T)
00120   SOCKLEN_T len;
00121 #elif defined(ARCH_LINUXALPHA)
00122   socklen_t len;
00123 #else
00124   int len;
00125 #endif
00126 
00127   len = sizeof(s->addr);
00128   rc = accept(s->sd, (struct sockaddr *) &s->addr, &len);
00129   if (rc >= 0) {
00130     new_s = (vmdsocket *) malloc(sizeof(vmdsocket));
00131     if (new_s != NULL) {
00132       *new_s = *s;
00133       new_s->sd = rc;
00134     }
00135   }
00136   return (void *)new_s;
00137 }
00138 
00139 int  vmdsock_write(void * v, const void *buf, int len) {
00140   vmdsocket *s = (vmdsocket *) v;
00141 #if defined(_MSC_VER)
00142   return send(s->sd, (const char*) buf, len, 0);  // windows lacks the write() call
00143 #else
00144   return write(s->sd, buf, len);
00145 #endif
00146 }
00147 
00148 int  vmdsock_read(void * v, void *buf, int len) {
00149   vmdsocket *s = (vmdsocket *) v;
00150 #if defined(_MSC_VER)
00151   return recv(s->sd, (char*) buf, len, 0); // windows lacks the read() call
00152 #else
00153   return read(s->sd, buf, len);
00154 #endif
00155 
00156 }
00157 
00158 void vmdsock_shutdown(void *v) {
00159   vmdsocket * s = (vmdsocket *) v;
00160   if (s == NULL)
00161     return;
00162 
00163 #if defined(_MSC_VER)
00164   shutdown(s->sd, SD_SEND);
00165 #else
00166   shutdown(s->sd, 1);  /* complete sends and send FIN */
00167 #endif
00168 }
00169 
00170 void vmdsock_destroy(void * v) {
00171   vmdsocket * s = (vmdsocket *) v;
00172   if (s == NULL)
00173     return;
00174 
00175 #if defined(_MSC_VER)
00176   closesocket(s->sd);
00177 #else
00178   close(s->sd);
00179 #endif
00180   free(s);  
00181 }
00182 
00183 int vmdsock_selread(void *v, int sec) {
00184   vmdsocket *s = (vmdsocket *)v;
00185   fd_set rfd;
00186   struct timeval tv;
00187   int rc;
00188  
00189   FD_ZERO(&rfd);
00190   FD_SET(s->sd, &rfd);
00191   memset((void *)&tv, 0, sizeof(struct timeval));
00192   tv.tv_sec = sec;
00193   do {
00194     rc = select(s->sd+1, &rfd, NULL, NULL, &tv);
00195   } while (rc < 0 && errno == EINTR);
00196   return rc;
00197 
00198 }
00199   
00200 int vmdsock_selwrite(void *v, int sec) {
00201   vmdsocket *s = (vmdsocket *)v;
00202   fd_set wfd;
00203   struct timeval tv;
00204   int rc;
00205  
00206   FD_ZERO(&wfd);
00207   FD_SET(s->sd, &wfd);
00208   memset((void *)&tv, 0, sizeof(struct timeval));
00209   tv.tv_sec = sec;
00210   do {
00211     rc = select(s->sd + 1, NULL, &wfd, NULL, &tv);
00212   } while (rc < 0 && errno == EINTR);
00213   return rc;
00214 }

Generated on Sat Aug 30 01:27:10 2008 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002