00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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>
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);
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);
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);
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 }