00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include <stdio.h>
00047 #include <sys/types.h>
00048 #include <sys/socket.h>
00049 #include <netinet/in.h>
00050 #include <strings.h>
00051 #include <string.h>
00052 #include <arpa/inet.h>
00053 #include <stdlib.h>
00054 #include <unistd.h>
00055 #include <signal.h>
00056 #include <errno.h>
00057 #include <pthread.h>
00058 #include <fcntl.h>
00059 #include "command_line_parser.h"
00060 #include "frame_comm.h"
00061
00062 int socket_comm(command_options_t *options) {
00063 static struct sockaddr_in serv_addr, cli_addr;
00064 enum {INIT,UNCONNECTED,QUEUE_FRAME};
00065 static int bridge_state=INIT;
00066 int oldopts;
00067 static int sockfd=0;
00068 static int clilen=0;
00069 static int newsockfd=0;
00070 char buffer[256];
00071 int n;
00072 char write_buffer[500];
00073 int write_chars;
00074
00075 switch (bridge_state) {
00076 case INIT:
00077 sockfd = socket(AF_INET, SOCK_STREAM, 0);
00078 if (sockfd < 0) {
00079 printf("ERROR opening socket\n");
00080 exit(0);
00081 }
00082 oldopts = fcntl(sockfd, F_GETFL, 0);
00083 fcntl(sockfd, F_SETFL, oldopts | O_NONBLOCK);
00084 bzero((char *) &serv_addr, sizeof(serv_addr));
00085 serv_addr.sin_family = AF_INET;
00086 serv_addr.sin_addr.s_addr = INADDR_ANY;
00087 serv_addr.sin_port = htons(options->port);
00088 if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
00089 printf("ERROR on binding\n");
00090 exit(0);
00091 }
00092 listen(sockfd,5);
00093 bridge_state=UNCONNECTED;
00094 break;
00095 case UNCONNECTED:
00096 errno=0;
00097 if ((newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen))==-1) {
00098 if (errno==EWOULDBLOCK) {
00099 }
00100 }
00101 else {
00102 bridge_state=QUEUE_FRAME;
00103 oldopts = fcntl(newsockfd, F_GETFL, 0);
00104 fcntl(newsockfd, F_SETFL, oldopts | O_NONBLOCK);
00105 }
00106 break;
00107 case QUEUE_FRAME:
00108 bzero(buffer,256);
00109 n = read(newsockfd,buffer,255);
00110 if (n<0) {
00111
00112 writeMessage(&msg,write_buffer);
00113 write_chars=write(newsockfd,write_buffer,strlen(write_buffer));
00114 }
00115 else if (n==0) {
00116
00117 close(newsockfd);
00118 bridge_state=UNCONNECTED;
00119 }
00120 else {
00121
00122
00123 }
00124 break;
00125 default:
00126 printf("Error: Unknown Communication State\n");
00127 exit(1);
00128 break;
00129 }
00130 return 0;
00131 }
00132
00133
00134
00135
00136