struct XUDPHost *xudpSocket(void);
1 struct XUDPHost *xudpSocket(void) 2 { 3 struct XUDPHost *xudphost; 4 int un_len, temp; 5 struct sockaddr_un xudp_addr; 6 7 if ( !(xudphost=malloc(sizeof(struct XUDPHost)))) 8 xudpError("xudpSocket: Allocating RAM"); 9 10 bzero((char *) &xudp_addr, sizeof(xudp_addr)); 11 if ( (xudphost->fdControl=socket(AF_UNIX, SOCK_STREAM, 0)) <0) 12 xudpError("xudp: socket(UNIX)"); /* Opens a UNIX Stream socket */ 13 if ( (xudphost->fdAudio=socket(AF_UNIX, SOCK_STREAM, 0)) <0) 14 xudpError("xudp: socket(UNIX)"); /* Opens a UNIX Stream socket */ 15 if ( (xudphost->fdVideo=socket(AF_UNIX, SOCK_STREAM, 0)) <0) 16 xudpError("xudp: socket(UNIX)"); /* Opens a UNIX Stream socket */ 17 18 /* Fill out address structure for server */ 19 20 xudp_addr.sun_family=AF_UNIX; /* AF_UNIX is the UNIX Domain 21 Protocol Family.*/ 22 23 /*** Control Port **********/ 24 strcpy(xudp_addr.sun_path, CONTROL_UNIX); /* Server stream path */ 25 26 un_len=strlen(xudp_addr.sun_path) + sizeof(xudp_addr.sun_family); 27 28 if (connect(xudphost->fdControl, (struct sockaddr *) &xudp_addr, 29 un_len) < 0) 30 xudpError("xudpSocket: Could not connect"); 31 32 /*** Audio Port **********/ 33 strcpy(xudp_addr.sun_path, AUDIO_UNIX); /* Server stream path */ 34 35 un_len=strlen(xudp_addr.sun_path) + sizeof(xudp_addr.sun_family); 36 37 if (connect(xudphost->fdAudio, (struct sockaddr *) &xudp_addr, 38 un_len) < 0) 39 xudpError("xudpSocket: Could not connect"); 40 41 /*** Video Port **********/ 42 strcpy(xudp_addr.sun_path, VIDEO_UNIX); /* Server stream path */ 43 44 un_len=strlen(xudp_addr.sun_path) + sizeof(xudp_addr.sun_family); 45 46 if (connect(xudphost->fdVideo, (struct sockaddr *) &xudp_addr, 47 un_len) < 0) 48 xudpError("xudpSocket: Could not connect"); 49 50 /*** Socket buffer sizes *************/ 51 52 temp=SOCKBUFSIZE; /* Set up maximum socket-level buffers */ 53 if (setsockopt(xudphost->fdControl, SOL_SOCKET, SO_SNDBUF, 54 &temp, sizeof(int))<0) xudpError("xudpSocket"); 55 if (setsockopt(xudphost->fdControl, SOL_SOCKET, SO_RCVBUF, 56 &temp, sizeof(int))<0) xudpError("xudpSocket"); 57 if (setsockopt(xudphost->fdAudio, SOL_SOCKET, SO_SNDBUF, 58 &temp, sizeof(int))<0) xudpError("xudpSocket"); 59 if (setsockopt(xudphost->fdAudio, SOL_SOCKET, SO_RCVBUF, 60 &temp, sizeof(int))<0) xudpError("xudpSocket"); 61 if (setsockopt(xudphost->fdVideo, SOL_SOCKET, SO_SNDBUF, 62 &temp, sizeof(int))<0) xudpError("xudpSocket"); 63 if (setsockopt(xudphost->fdVideo, SOL_SOCKET, SO_RCVBUF, 64 &temp, sizeof(int))<0) xudpError("xudpSocket"); 65 66 return xudphost; 67 }
int xudpBind(struct XUDPHost *xudphost, u_short port);
1 int xudpBind(struct XUDPHost *xudphost, u_short port) 2 { 3 xudpSendFunction(xudphost, F_BIND, (char *) &port); 4 5 return 0; 6 }
int xudpListen(struct XUDPHost *xudphost);
1 int xudpListen(struct XUDPHost *xudphost) 2 { 3 xudpSendFunction(xudphost, F_LISTEN, NULL); 4 return 0; 5 }
int xudpAccept(struct XUDPHost *xudphost);
1 int xudpAccept(struct XUDPHost *xudphost) 2 { 3 xudpSendFunction(xudphost, F_ACCEPT, NULL); 4 5 if (xudpGetFunction(xudphost)==F_ERROR) 6 return xudpGetFunction(xudphost); 7 8 streamRead(xudphost->fdControl, (char *) &xudphost->hostaddr, 9 sizeof(struct sockaddr_in)); 10 11 xudphost->pHostent=gethostbyaddr((char *)&xudphost->hostaddr.sin_addr, 12 sizeof(struct in_addr), AF_INET); 13 14 return 0; 15 }
int xudpConnect(struct XUDPHost *xudphost, char *fqdn, u_short port);
1 int xudpConnect(struct XUDPHost *xudphost, char *fqdn, u_short port) 2 { 3 xudphost->pHostent=gethostbyname(fqdn); 4 /* Given any DNS or /etc/hosts 5 registered hostname, gethostbyname() 6 will return useful information, 7 including the 32-bit IP that we need 8 */ 9 if (xudphost->pHostent==NULL) 10 xudpError("Trying to resolve hostname"); 11 /* Make sure our hostname is valid */ 12 13 memcpy(&xudphost->hostaddr.sin_addr, xudphost->pHostent->h_addr_list[0], 14 sizeof(struct in_addr)); 15 xudphost->hostaddr.sin_family=AF_INET; 16 if (port==0) xudphost->hostaddr.sin_port=htons(SERVER_PORT); 17 else xudphost->hostaddr.sin_port=htons(port); 18 19 xudpSendFunction(xudphost, F_CONNECT, NULL); 20 21 if (xudpGetFunction(xudphost)==F_ERROR) 22 return xudpGetFunction(xudphost); 23 streamRead(xudphost->fdControl, (char *) &xudphost->hostaddr, 24 sizeof(struct sockaddr_in)); 25 26 return 0; 27 }
int xudpSend(struct XUDPHost *xudphost, char *buffer, u_short bytes, u_char type, u_long timeout);
1 int xudpSend(struct XUDPHost *xudphost, char *buffer, u_short bytes, 2 u_char type, u_long timeout) 3 { 4 Timestamp tto; 5 int result; 6 7 if ((timeout/GRANULARITY)>RELIABLE) tto=RELIABLE; 8 else tto=timeout/GRANULARITY; 9 10 /* CAUTION: Improve Error Handling! */ 11 switch (type) 12 { 13 /* case AUDIO: 14 xudpSendFunction(xudphost, F_SENDAUDIO, (char *)&bytes); 15 if (streamWrite(xudphost->fdControl, (char *)&tto, 16 sizeof(tto))!=sizeof(tto)) 17 xudpError("UNIX Stream Failed"); 18 if (streamWrite(xudphost->fdAudio, buffer, bytes)!=bytes) 19 xudpError("UNIX Stream Failed"); 20 break;*/ 21 case VIDEO: 22 if ((result=send(xudphost->fdVideo, buffer, bytes, 0))>0) 23 { 24 if (result!=bytes) 25 xudpError("UNIX Stream Failed"); 26 xudpSendFunction(xudphost, F_SENDVIDEO, (char *)&bytes); 27 if (streamWrite(xudphost->fdControl, (char *)&tto, 28 sizeof(tto))!=sizeof(tto)) 29 xudpError("UNIX Stream Failed"); 30 } 31 else return -1; 32 33 break; 34 default: return 0; break; 35 } 36 37 38 return bytes; 39 }
int xudpRecv(struct XUDPHost *xudphost, char *buffer, u_short *bytes, u_char *type);
1 int xudpRecv(struct XUDPHost *xudphost, char *buffer, u_short *bytes, 2 u_char *type) 3 { 4 char cmd; 5 u_short length; 6 7 cmd=xudpGetFunction(xudphost); 8 switch (cmd) 9 { 10 case F_RECVAUDIO: break; 11 case F_RECVVIDEO: 12 streamRead(xudphost->fdControl, (char *)&length, sizeof(length)); 13 streamRead(xudphost->fdVideo, buffer, length); 14 memcpy(bytes, &length, sizeof(u_short)); 15 *type=VIDEO; 16 break; 17 default: return 0; break; 18 } 19 return length; 20 }
int xudpClose(struct XUDPHost *xudphost);
1 int xudpClose(struct XUDPHost *xudphost) 2 { 3 xudpSendFunction(xudphost, F_CLOSE, NULL); 4 xudpGetFunction(xudphost); 5 close(xudphost->fdControl); 6 close(xudphost->fdAudio); 7 close(xudphost->fdVideo); 8 free(xudphost); 9 return 0; 10 }