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 #ifndef WIN32
00035 #include "JSocket.h"
00036
00037 namespace cmlabs {
00038
00039 void JSocket::osCloseSocket(SOCKET thisSocket) {
00040
00041 shutdown(thisSocket, 2);
00042 close(thisSocket);
00043 }
00044
00045 bool JSocket::isSocketValid() {
00046 if (mySocket == 0)
00047 return false;
00048 else
00049 return true;
00050 }
00051
00052 bool JSocket::setSocketNotValid() {
00053 mySocket = 0;
00054 return true;
00055 }
00056
00057
00058 void JSocket::setNonBlockingMode() {
00059
00060 long parm = fcntl(mySocket, F_GETFL);
00061 parm |= O_NONBLOCK;
00062 fcntl(mySocket, F_SETFL, parm);
00063 }
00064
00065 void JSocket::setBlockingMode() {
00066 long parm = fcntl(mySocket, F_GETFL);
00067 parm &= (!O_NONBLOCK);
00068 fcntl(mySocket, F_SETFL, parm);
00069 }
00070
00071
00072 bool JSocket::createSocket() {
00073 if (!isSocketValid()) {
00074 mySocket = socket(AF_INET, SOCK_STREAM, 0);
00075
00076 if (mySocket == INVALID_SOCKET) {
00077
00078 dealWithSocketError(getLastOSErrorNumber());
00079 setSocketNotValid();
00080 return false;
00081 }
00082 }
00083
00084 setNonBlockingMode();
00085
00086
00087 struct linger tmp = {1, 0};
00088
00089 setsockopt(mySocket, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof(tmp));
00090
00091 char delay = 1;
00092
00093 setsockopt(mySocket, IPPROTO_TCP, TCP_NODELAY, (char*) &delay, sizeof(delay));
00094
00095
00096
00097
00098 return true;
00099 }
00100
00101
00102 void JSocket::dealWithSocketError(int wsaError, JString intro) {
00103
00104 if (wsaError == 100) {
00105 lastErrorMessage = "Cannot initialize WinSock!";
00106 lastErrorRecoverable = false;
00107 }
00108 else {
00109 lastErrorMessage = JString("TCP error with no description: ") + JString(wsaError);
00110 lastErrorRecoverable = false;
00111 }
00112
00113 if (intro.length() > 0)
00114 lastErrorMessage = intro + JString(": ") + lastErrorMessage;
00115 }
00116
00117
00118 int JSocket::getLastOSErrorNumber() {
00119 return errno;
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 }
00134
00135
00136 #endif // WIN32