104#define closesocket close
117 connectionState=CLOSED;
142 connectionState=CLOSED;
145 connectionState=CONNECTING;
147 connectionState=CONNECTED;
149 connectionState=CLOSED;
174 unsigned long flag=1;
178 retval=ioctlsocket(whichFD,FIONBIO,&
flag);
179 if (retval==SOCKET_ERROR)
184 int flags = fcntl(whichFD, F_GETFL, 0);
188 flags &= ~(O_NONBLOCK);
190 if (fcntl(whichFD, F_SETFL, flags) < 0)
221 retval=send(whichFD,(
const char *)
msg,len,0);
223 if (retval==SOCKET_ERROR)
243 retval=send(whichFD,(
const char *)
msg,len,0);
245 if (retval==SOCKET_ERROR)
266 for (i=0; i<len; i++)
269 if ((data>1)&&(data<255))
271 retval=send(whichFD,(
char *)&data,1,0);
281 retval=send(whichFD,(
char *)&one,1,0);
294 retval=send(whichFD,(
char *)&data,1,0);
322 retval=send(fd,
msg,strlen(
msg),0);
328 if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&
clientList)))
331 retval=send(whichFD,
msg,strlen(
msg),0);
346 va_start(arg,format);
347 vsprintf(
string,format,arg);
357 retval=send(fd,
string,strlen(
string),0);
363 if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&
clientList)))
366 retval=send(whichFD,
string,strlen(
string),0);
380 struct sockaddr_in sin;
381 int sinSize=
sizeof(sin);
385 if(getpeername(fd,(sockaddr *)&sin,&sinSize)==0)
386 return(ntohl(sin.sin_addr.s_addr));
390 if(getpeername(whichFD,(sockaddr *)&sin,&sinSize)==0)
391 return(ntohl(sin.sin_addr.s_addr));
401 struct sockaddr_in sin;
402 int sinSize=
sizeof(sin);
406 if(getpeername(fd,(sockaddr *)&sin,&sinSize)==0)
407 return(ntohs(sin.sin_port));
411 if(getpeername(whichFD,(sockaddr *)&sin,&sinSize)==0)
412 return(ntohs(sin.sin_port));
421 struct sockaddr_in sin;
422 int sinSize=
sizeof(sin);
429 if (connectionState==CONNECTED)
431 if (connectionState==CLOSED)
436 if(getpeername(whichFD,(sockaddr *)&sin,&sinSize)==0)
437 if ( (sin.sin_addr.s_addr!=htonl(0)) && (
CanWrite(whichFD)) )
439 connectionState=CONNECTED;
465char *
TCP::Gets(
char *
string,
int n,
int whichFD)
484 Wait(inputDelay,0,fdSet,whichFD);
485 if (! FD_ISSET(whichFD,&fdSet))
487 DBGMSG(
"Gets timeout: " << inputDelay);
491 retval=
Read((
unsigned char *)&c,1,whichFD);
492 if ((retval>0)&&(c!=0))
499 else if ((retval==0)&&(i==0))
501 DBGMSG(
"Remote endpoint closed (1)");
518 retval=recv(fd,(
char *)
msg,len,0);
526 if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&
clientList)))
528 retval=recv(whichFD,(
char *)
msg,len,0);
555 while ((time(
NULL)<=stop_time)&&((
uint32)bytes_read<len))
557 Wait(1,0,set,whichFD);
559 retval=
Read(
msg+bytes_read,len-bytes_read,whichFD);
562 DBGMSG(
"Remote close!\n");
581 retval=recv(fd,(
char *)
msg,len,MSG_PEEK);
588 if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&
clientList)))
590 retval=recv(whichFD,(
char *)
msg,len,MSG_PEEK);
607 sint32 retval,bytesRead=0;
615 if ((whichFD>maxFD) || (!FD_ISSET(whichFD,&
clientList)))
621 for (i=0; i<len; i++)
623 retval=recv(fd,&data,1,0);
637 retval=recv(fd,&data,1,0);
667 for(i=0; i<=maxFD; i++)
684 connectionState=CLOSED;
695 connectionState=CLOSED;
707 if (shutdown(fd,2)==0)
712 else if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&
clientList)))
716 for (i=maxFD; i>=0; i--)
748 FD_SET(fd,&inputSet);
750 else if (whichFD > 0)
751 FD_SET(whichFD,&inputSet);
758 FD_SET(whichFD,&inputSet);
761 return(
Wait(sec,usec,inputSet,returnSet));
770 int retval=0,done,givenMax;
777 if ((sec==-1)&&(usec==-1))
785 for (
uint32 i=0; i<(
sizeof(fd_set)*8); i++)
787 if (FD_ISSET(i,&givenSet))
795 retval=select(givenMax+1,&returnSet,0,0,
NULL);
799 retval=select(givenMax+1,&returnSet,0,0,&tv);
805 else if ((retval==-1)&&(errno==EINTR))
807 if (noTimeout==
FALSE)
810 timeout=timethen-timenow;
839 FD_SET(whichFD,&outputSet);
845 retval=select(maxFD+1,0,&outputSet,0,
NULL);
850 else if ((retval==-1)&&(errno==EINTR))
872 FD_SET(whichFD,&outputSet);
875 retval=select(whichFD+1,0,&outputSet,0,&tv);
886 struct hostent *hostStruct;
887 struct in_addr *hostNode;
889 if (isdigit(Host[0]))
890 return (
Bind( ntohl(inet_addr(Host)), port,reuseAddr) );
892 strcpy(hostName, Host);
894 hostStruct = gethostbyname(Host);
895 if (hostStruct ==
NULL)
897 hostNode = (
struct in_addr *) hostStruct->h_addr;
898 return (
Bind(ntohl(hostNode->s_addr),port,reuseAddr) );
913 addr.sin_family=AF_INET;
915 addr.sin_addr.s_addr=IP;
922 ERRMSG(
"Couldn't set nonblocking mode!");
938 retval=setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(
char *)&opval,
sizeof(opval));
940 fprintf(stderr,
"Could not set socket to SO_REUSEADDR\n");
944 retval=bind(fd,(
struct sockaddr *)&addr,
sizeof(addr));
946 if (retval==SOCKET_ERROR)
953 DBGMSG(
"Bind failure (" << status <<
") IP "<< IP <<
" PORT "<< ntohs(Port));
972 struct hostent *hostStruct;
973 struct in_addr *hostNode;
975 if (isdigit(Host[0]))
976 return (
Connect( ntohl(inet_addr(Host)), port) );
978 strcpy(hostName, Host);
980 hostStruct = gethostbyname(Host);
981 if (hostStruct ==
NULL)
982 {
ERRMSG(
"Can't resolve host");
return (0);}
983 hostNode = (
struct in_addr *) hostStruct->h_addr;
984 return (
Connect(ntohl(hostNode->s_addr),port) );
990 struct timeval sleep_time;
991 struct sockaddr_in serverAddr;
997 serverAddr.sin_family=AF_INET;
998 serverAddr.sin_port=Port;
999 serverAddr.sin_addr.s_addr=IP;
1002 {
ERRMSG(
"Can't connect in server mode");
return(
FALSE);}
1010 while ((tries < 10) && (result == -1))
1013 result = connect(fd,(
struct sockaddr *)&serverAddr,
sizeof(serverAddr));
1017 if (result==SOCKET_ERROR)
1021 if ((status ==
ISCONN) && (result == -1))
1034 sleep_time.tv_sec = 0;
1035 sleep_time.tv_usec = (100000*(tries+1));
1037 Sleep((sleep_time.tv_usec)/1000);
1039 select(0, 0, 0, 0, &sleep_time);
1048 connectionState=CONNECTED;
1058 struct hostent *hostStruct;
1059 struct in_addr *hostNode;
1061 if (isdigit(Host[0]))
1062 return (
ConnectAsync( ntohl(inet_addr(Host)), port) );
1064 strcpy(hostName, Host);
1066 hostStruct = gethostbyname(Host);
1067 if (hostStruct ==
NULL)
1069 hostNode = (
struct in_addr *) hostStruct->h_addr;
1077 struct sockaddr_in serverAddr;
1078 int status,connectErrno;
1084 serverAddr.sin_family=AF_INET;
1085 serverAddr.sin_port=Port;
1086 serverAddr.sin_addr.s_addr=IP;
1093 if (connectionState==CONNECTING)
1097 DBGMSG(
"CONNECTION COMPLETE at point 1");
1098 connectionState=CONNECTED;
1106 result = connect(fd,(
struct sockaddr *)&serverAddr,
sizeof(serverAddr));
1111 if (result==SOCKET_ERROR)
1113 DBGMSG(
"Socket error 1 " << status);
1122 retval=
Bind(myIP,myPort);
1123 DBGMSG(
"BIND = "<<retval);
1125 result = connect(fd,(
struct sockaddr *)&serverAddr,
sizeof(serverAddr));
1128 if (result==SOCKET_ERROR)
1130 DBGMSG(
"Socket error 2 " << status);
1141 connectionState=CONNECTING;
1147 DBGMSG(
"Fail " << connectErrno <<
" " << status);
1148 connectionState=CLOSED;
1153 connectionState=CONNECTED;
1170 int status=WSAGetLastError();
1171 if (status==0)
return(
OK);
1172 else if (status==WSAEINTR)
return(
INTR);
1173 else if (status==WSAEINPROGRESS)
return(
INPROGRESS);
1174 else if (status==WSAECONNREFUSED)
return(
CONNREFUSED);
1175 else if (status==WSAEINVAL)
return(
INVAL);
1176 else if (status==WSAEISCONN)
return(
ISCONN);
1177 else if (status==WSAENOTSOCK)
return(
NOTSOCK);
1178 else if (status==WSAETIMEDOUT)
return(
TIMEDOUT);
1179 else if (status==WSAEALREADY)
return(
ALREADY);
1180 else if (status==WSAEWOULDBLOCK)
return(
WOULDBLOCK);
1181 else if (status==WSAEBADF)
return(
BADF);
1185 if (status==0)
return(
OK);
1186 else if (status==EINTR)
return(
INTR);
1187 else if (status==EINPROGRESS)
return(
INPROGRESS);
1188 else if (status==ECONNREFUSED)
return(
CONNREFUSED);
1189 else if (status==EINVAL)
return(
INVAL);
1190 else if (status==EISCONN)
return(
ISCONN);
1191 else if (status==ENOTSOCK)
return(
NOTSOCK);
1192 else if (status==ETIMEDOUT)
return(
TIMEDOUT);
1193 else if (status==EALREADY)
return(
ALREADY);
1194 else if (status==EAGAIN)
return(
AGAIN);
1195 else if (status==EWOULDBLOCK)
return(
WOULDBLOCK);
1196 else if (status==EBADF)
return(
BADF);
1210 struct sockaddr_in clientAddr;
1211 int addrlen=
sizeof(clientAddr);
1213 clientFD=accept(fd,(
struct sockaddr *)&clientAddr,&addrlen);
1230 int addrlen=
sizeof(
struct sockaddr);
1232 clientFD=accept(fd,(
struct sockaddr *)clientAddr,&addrlen);
sint32 TimedRead(uint8 *msg, uint32 len, int seconds, sint32 whichFD=0)
bit8 ConnectAsync(uint32 IP, uint16 port)
int Wait(sint32 sec, sint32 usec, fd_set &returnSet, sint32 whichFD=0)
sint32 SetBlocking(bit8 block, sint32 whichFD=0)
sint32 Close(sint32 whichFD=0)
bit8 CanWrite(sint32 whichFD=0)
bit8 Connect(uint32 IP, uint16 port)
sint32 GetConnection(void)
uint16 GetRemotePort(sint32 whichFD=0)
sint32 Peek(uint8 *msg, uint32 len, sint32 whichFD=0)
sint32 EncapsulatedRead(uint8 *msg, uint32 len, sint32 whichFD=0)
sint32 EncapsulatedWrite(uint8 *msg, uint32 len, sint32 whichFD=0)
sint32 WriteNB(uint8 *msg, uint32 len, sint32 whichFD=0)
uint32 GetRemoteIP(sint32 whichFD=0)
sint32 WriteString(char *msg, sint32 whichFD=0)
sint32 Write(const uint8 *msg, uint32 len, sint32 whichFD=0)
bit8 IsConnected(sint32 whichFD=0)
sint32 Printf(sint32 whichFD, const char *format,...)
sint32 Read(uint8 *msg, uint32 len, sint32 whichFD=0)
void WaitWrite(sint32 whichFD=0)
bit8 Bind(uint32 IP, uint16 port, bit8 reuseAddr=FALSE)
char * Gets(char *string, int n, int whichFD=0)
void SetSec(uint32 newsec)
uint32 GetSec(void) const
void SetUsec(uint32 newusec)
void GetTimevalMT(struct timeval &tv)
uint32 GetUsec(void) const