Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

cpmsocket.c

Go to the documentation of this file.
00001 #include <unistd.h>
00002 #include <netdb.h>
00003 #include <string.h>
00004 #include <stdlib.h>
00005 #include "cpmsocket.h"
00006 
00007 PMSocket *pmsocket_open(const char *address, uint16_t port, transport trans)
00008 {
00009         PMSocket *pmSocket = (PMSocket *) malloc(sizeof(PMSocket));
00010         struct hostent *hostEnt;
00011         uint32_t addrLen;
00012 
00013         if ((hostEnt = gethostbyname(address)) == NULL)
00014                 return NULL;
00015 
00016         if (trans == TCP) {
00017                 if ((pmSocket->socketFD = socket(PF_INET, SOCK_STREAM, 0)) == PMSOCKET_ERROR)
00018                         return NULL;
00019         }
00020         else if (trans == UDP) {
00021                 if ((pmSocket->socketFD = socket(PF_INET, SOCK_DGRAM, 0)) == PMSOCKET_ERROR)
00022                         return NULL;
00023         }
00024 
00025         pmSocket->addr.sin_family = PF_INET;
00026         pmSocket->addr.sin_port = htons(port);
00027         memcpy(&(pmSocket->addr.sin_addr.s_addr), hostEnt->h_addr_list[0],
00028                    hostEnt->h_length);
00029         pmSocket->trans = trans;
00030 
00031         addrLen = sizeof(pmSocket->addr);
00032         if (bind(pmSocket->socketFD, (struct sockaddr *) &(pmSocket->addr), addrLen) 
00033                         == PMSOCKET_ERROR)
00034                 return NULL;
00035 
00036         return pmSocket;
00037 }
00038 
00039 PMSocket *pmsocket_connect(const char *address, uint16_t port)
00040 {
00041         PMSocket *pmSocket = (PMSocket *) malloc(sizeof(PMSocket));
00042         struct hostent *hostEnt;
00043         uint32_t addrLen;
00044 
00045         if ((hostEnt = gethostbyname(address)) == NULL)
00046                 return NULL;
00047 
00048         if ((pmSocket->socketFD = socket(PF_INET, SOCK_STREAM, 0)) == PMSOCKET_ERROR)
00049                 return NULL;
00050 
00051         pmSocket->addr.sin_family = PF_INET;
00052         pmSocket->addr.sin_port = htons(port);
00053         memcpy(&(pmSocket->addr.sin_addr.s_addr), hostEnt->h_addr_list[0],
00054                    hostEnt->h_length);
00055         pmSocket->trans = TCP;
00056 
00057         addrLen = sizeof(pmSocket->addr);
00058         if (connect(pmSocket->socketFD, (struct sockaddr *) &(pmSocket->addr), addrLen)
00059                 == PMSOCKET_ERROR)
00060                 return NULL;
00061         
00062         return pmSocket;
00063 }
00064 
00065 PMSocket *pmsocket_accept(PMSocket *pmSocket, int queue)
00066 {
00067         PMSocket *client = (PMSocket *) malloc(sizeof(PMSocket));
00068         uint32_t addrLen;
00069 
00070         listen(pmSocket->socketFD, queue);
00071         client->trans = TCP;
00072         client->socketFD = accept(pmSocket->socketFD, (struct sockaddr *) &(pmSocket->addr), &addrLen);
00073         
00074         return client;
00075 }
00076 
00077 int pmsocket_close(PMSocket *pmSocket)
00078 {
00079         if (pmSocket->socketFD != PMSOCKET_ERROR)
00080                 close(pmSocket->socketFD);
00081 
00082         free(pmSocket);
00083         pmSocket = NULL;
00084 
00085         return 0;
00086 }
00087 
00088 int pmsocket_send(const PMSocket *pmSocket, const byte *data, uint32_t length)
00089 {
00090         uint32_t sent;
00091 
00092         if (pmSocket->trans == TCP) {
00093                 do {
00094                         sent = send(pmSocket->socketFD, data, length, 0);
00095                         length -= sent;
00096                 } while (sent != PMSOCKET_ERROR && length > 0);
00097         }
00098         else if (pmSocket->trans == UDP) {
00099                 do {
00100                         sent = sendto(pmSocket->socketFD, data, length, 0,
00101                                                   (struct sockaddr *) &(pmSocket->addr),
00102                                                   (socklen_t) sizeof(pmSocket->addr));
00103                         length -= sent;
00104                 } while (sent != PMSOCKET_ERROR && length > 0);
00105         }
00106         
00107         return 0;
00108 }
00109 
00110 PMSocket *pmsocket_recv(const PMSocket *pmSocket, byte *data, uint32_t length, PMSocket *sender)
00111 {
00112         uint32_t received;
00113         PMSocket *pms = (sender == NULL) ? (PMSocket *) malloc(sizeof(PMSocket)) : sender;
00114 
00115         if (pmSocket->trans == TCP) {
00116                 do {
00117                         received = recv(pmSocket->socketFD, data, length, 0);
00118                         length -= received;
00119                 } while (received != PMSOCKET_ERROR && length > 0);
00120                 if (sender != NULL) {
00121                         free(pms);
00122                         pms = NULL;
00123                 }
00124                         
00125         }
00126         else if (pmSocket->trans == UDP) {
00127                 uint32_t addrLen;
00128                 do {
00129                         received = recvfrom(pmSocket->socketFD, data, length, 0,
00130                                                                 (struct sockaddr *) &(pms->addr),
00131                                                                 (socklen_t *) &addrLen);
00132                         length -= received;
00133                 } while (received != PMSOCKET_ERROR && length > 0);
00134 
00135                 if (sender != NULL)
00136                         pms = NULL;
00137         }
00138 
00139         return pms;
00140 }
00141 

Generated on Mon Dec 1 17:00:22 2003 for Protomake by doxygen1.3