00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <CSql.h>
00021 #include <Network.h>
00022 #include <SqlNetworkHandler.h>
00023
00024 DbRetVal TCPServer::start()
00025 {
00026 DbRetVal rv = OK;
00027 if (port == 0 )
00028 {
00029 printError(ErrBadArg, "Set the port first before starting\n");
00030 return ErrBadArg;
00031 }
00032 struct sockaddr_in my_addr;
00033 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
00034 printError(ErrOS, "Unable to create socket\n");
00035 return ErrOS;
00036 }
00037 my_addr.sin_family = AF_INET;
00038 my_addr.sin_port = htons(port);
00039 my_addr.sin_addr.s_addr = INADDR_ANY;
00040 memset(&(my_addr.sin_zero), '\0', 8);
00041 if (bind(sockfd, (struct sockaddr *)&my_addr,
00042 sizeof(struct sockaddr)) == -1) {
00043 return ErrOS;
00044 }
00045 if (listen(sockfd, 10) == -1) {
00046 return ErrOS;
00047 }
00048 return rv;
00049
00050 }
00051 DbRetVal TCPServer::stop()
00052 {
00053 DbRetVal rv = OK;
00054 close (sockfd);
00055 return rv;
00056 }
00057 DbRetVal TCPServer::handleClient()
00058 {
00059 printf("PRABA::handling client \n");
00060 DbRetVal rv = OK;
00061 socklen_t addressLen = sizeof(struct sockaddr);
00062 clientfd = accept(sockfd, (struct sockaddr*) &clientAddress, &addressLen);
00063 int ret = os::fork();
00064 if (ret) {
00065
00066 close(clientfd);
00067 return OK;
00068 }else if (ret == 0) {
00069
00070 int response = 1;
00071 int ret = os::send(clientfd, &response, 4, 0);
00072 if (ret == -1)
00073 {
00074 printError(ErrOS, "Unable to communicate to peer\n");
00075 return ErrOS;
00076 }
00077 printf("sent connect ack packet to client\n");
00078 fd_set fdset;
00079 struct timeval timeout;
00080 SqlNetworkHandler handler;
00081 PacketHeader header;
00082 while(true) {
00083 FD_ZERO(&fdset);
00084 FD_SET(clientfd, &fdset);
00085 timeout.tv_sec = 5;
00086 timeout.tv_usec = 0;
00087 int ret = os::select(clientfd+1, &fdset, 0, 0, &timeout);
00088 if (ret > 0) {
00089 printf("something in fd\n");
00090 int numbytes = os::recv(clientfd,&header,sizeof(PacketHeader),0);
00091 if (numbytes == -1)
00092 {
00093 printError(ErrOS, "Error reading from socket\n");
00094 return ErrOS;
00095 }
00096 printf("HEADER says packet type is %d\n", header.packetType);
00097 if (header.packetType == NW_PKT_DISCONNECT) exit(0);
00098 char *buffer = (char*) malloc(header.packetLength);
00099 numbytes = os::recv(clientfd,buffer,header.packetLength,0);
00100 if (numbytes == -1)
00101 {
00102 printError(ErrOS, "Error reading from socket\n");
00103 return ErrOS;
00104 }
00105
00106 int response = handler.process(header, buffer);
00107 numbytes = os::send(clientfd, &response, 4, 0);
00108 if (numbytes != 4)
00109 {
00110 printError(ErrOS, "Error writing to socket\n");
00111 return ErrOS;
00112 }
00113 } else printf("Nothing in fd %d\n", ret);
00114 }
00115 }else {
00116 printError(ErrOS, "Unable to fork new process");
00117 return ErrOS;
00118 }
00119 return OK;
00120 }