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 UDPServer::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_DGRAM, 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 return rv;
00046
00047 }
00048 DbRetVal UDPServer::stop()
00049 {
00050
00051 DbRetVal rv = OK;
00052 close(sockfd);
00053 return rv;
00054 }
00055 DbRetVal UDPServer::handleClient()
00056 {
00057 DbRetVal rv = OK;
00058 PacketHeader header;
00059 socklen_t addressLen = sizeof(struct sockaddr);
00060
00061 int numbytes = recvfrom(sockfd, &header, sizeof(PacketHeader), 0,
00062 (struct sockaddr*) &clientAddress, &addressLen);
00063 if (numbytes == -1)
00064 {
00065 printf("Error reading from socket\n");
00066 return ErrOS;
00067 }
00068
00069
00070 if (header.packetType == NW_PKT_CONNECT)
00071 {
00072 int response =1;
00073 numbytes = sendto(sockfd, &response, 4, 0,
00074 (struct sockaddr*) &clientAddress, addressLen);
00075 if (numbytes != 4)
00076 {
00077 printf("Error writing to socket\n");
00078 return ErrOS;
00079 }
00080 return OK;
00081 }
00082 char *buffer = (char*) malloc(header.packetLength);
00083 fd_set fdset;
00084 FD_ZERO(&fdset);
00085 FD_SET(sockfd, &fdset);
00086 struct timeval timeout;
00087 timeout.tv_sec = Conf::config.getNetworkResponseTimeout();
00088 timeout.tv_usec = 0;
00089 int ret = os::select(sockfd+1, &fdset, 0, 0, &timeout);
00090 if (ret <= 0) {
00091 printError(ErrPeerTimeOut,"Response timeout for peer site\n");
00092 return ErrPeerTimeOut;
00093 }
00094
00095 numbytes = recvfrom(sockfd, buffer, header.packetLength, 0,
00096 (struct sockaddr*) &clientAddress, &addressLen);
00097
00098
00099 if (numbytes == -1)
00100 {
00101 printf("Error reading from socket\n");
00102 return ErrOS;
00103 }
00104 SqlNetworkHandler handler;
00105 int response = handler.process(header, buffer);
00106 numbytes = sendto(sockfd, &response, 4, 0,
00107 (struct sockaddr*) &clientAddress, addressLen);
00108 if (numbytes != 4)
00109 {
00110 printf("Error writing to socket\n");
00111 return ErrOS;
00112 }
00113 return OK;
00114 }