00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include <tcp_client/class_tcp.h>
00028
00029 tcp_client::tcp_client(const char*ip,int port,bool async_comm)
00030 {
00031 err=0;
00032
00033 connected=false;
00034
00035 sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
00036 if(sock<0)
00037 {
00038 sprintf(err_msg,"Cannot open socket");
00039 err=-1;
00040 return;
00041 }
00042
00043 async=async_comm;
00044
00045
00046 memset(&server, 0, sizeof(server));
00047 server.sin_family = AF_INET;
00048 server.sin_addr.s_addr = inet_addr(ip);
00049 server.sin_port = htons(port);
00050 }
00051
00052 tcp_client::~tcp_client()
00053 {
00054 Disconnect();
00055 }
00056
00057 int tcp_client::Connect(void)
00058 {
00059 err=0;
00060
00061 ret=connect(sock,(struct sockaddr *) &server,sizeof(server));
00062 if(ret<0)
00063 {
00064 sprintf(err_msg,"Failed to connect with server");
00065 err=-2;
00066 return -1;
00067 }
00068
00069 if(async)
00070 {
00071 fcntl(sock,F_SETOWN,getpid());
00072 fcntl(sock,F_SETFL,O_ASYNC);
00073 }
00074
00075 connected=true;
00076
00077 return 0;
00078 }
00079
00080 int tcp_client::Disconnect(void)
00081 {
00082 err=0;
00083
00084 ret=close(sock);
00085 if(ret<0)
00086 {
00087 sprintf(err_msg,"Failed to close connection");
00088 err=-3;
00089 return -1;
00090 }
00091
00092 connected=false;
00093
00094 return 0;
00095 }
00096
00097 int tcp_client::Send(char*data,int size)
00098 {
00099 if(!connected)
00100 {
00101 sprintf(err_msg,"Connection not established");
00102 err=-4;
00103 return -1;
00104 }
00105
00106 err=0;
00107 errno=0;
00108 ret=send(sock,data,size,0);
00109
00110 if(errno==EPIPE)
00111 {
00112 sprintf(err_msg,"Pipe broke");
00113 err=-4;
00114 return -1;
00115 }else if(ret<size)
00116 {
00117 sprintf(err_msg,"Mismatch in number of sent bytes");
00118 err=-4;
00119 return -1;
00120 }else if(errno!=0)
00121 {
00122 sprintf(err_msg,"Alarm! error not caught");
00123 perror("send");
00124 err=-3;
00125 return -1;
00126 }
00127
00128 return 0;
00129 }
00130
00131 int tcp_client::Receive(char*data,int size,bool peek,int*number,int flags)
00132 {
00133 if(!connected)
00134 {
00135 sprintf(err_msg,"Connection not established");
00136 err=-4;
00137 return -1;
00138 }
00139
00140 err=0;
00141
00142
00143
00144
00145
00146 if(peek)
00147 {
00148 ret=recv(sock,data,size, MSG_PEEK);
00149 if(ret<0)
00150 {
00151 sprintf(err_msg,"Failed to peek data from server");
00152 err=-5;
00153 return -1;
00154 }
00155
00156 return 0;
00157 }
00158
00159
00160 ret=recv(sock,data,size,flags);
00161 if(ret<0)
00162 {
00163 sprintf(err_msg,"Failed to receive bytes from server");
00164 err=-5;
00165 return -1;
00166 }else if(number!=NULL)
00167 {
00168 *number=ret;
00169 }
00170
00171 return 0;
00172 }
00173
00174 int tcp_client::perr(const char*text)
00175 {
00176 if(err<0)
00177 {
00178 cout<<"Error!! "<<text<<", "<<err_msg<<endl;
00179 return -1;
00180 }
00181 return 0;
00182 }
00183
00184 int tcp_client::GetSocket()
00185 {
00186 return sock;
00187 }