/*************************************************** CUT_WSThread purpose Constructor params None return None ****************************************************/ CUT_WSThread::CUT_WSThread() : m_lSendTimeOut(0), // Initialize send timeout m_lReceiveTimeOut(0), // Initialize receive timeout m_bBlockingMode(FALSE), // Set non blocking mode m_nShutDownFlag(FALSE) // Clear shutdown flag { // The send/receive time out values are use with the WINSOCK ver 2.0 or later #ifdef _WINSOCK_2_0_ SetSendTimeOut(30000); SetReceiveTimeOut(30000); #endif m_clientSocket = INVALID_SOCKET; m_nSockType = 0; }
/*Test Recplayer UDP Demo*/ static int RecPlayProcess(int *puserIndex) { int nLen; MsgHeader header, *pheader, sd_header; unsigned char szData[1280]; int fileflags; int userIndex = *puserIndex; if(userIndex >= gLiveMaxUserNum || userIndex < 0) { printf("Exit RecPlayProcess Thread!!!!\n"); pthread_detach(pthread_self()); return 0; } LIVE_SOCKET socket = getRecuserTcpSocket(userIndex); printf("enter live RecPlayProcess() function!!\n"); SetSendTimeOut(socket, 10); SetRecvTimeOut(socket, 10); memset(&header, 0, sizeof(header)); pheader = &header; sd_header.sLen = htons(sizeof(MsgHeader)); sd_header.sVer = MSG_VER; sd_header.sMsgType = MSG_TYPE_PASSWORD; if((fileflags = fcntl(socket, F_GETFL, 0)) == -1) { printf("fcntl F_GETFL error:%d,error msg: = %s\n", errno, strerror(errno)); return -1; } if(fcntl(socket, F_SETFL, fileflags & (~O_NONBLOCK)) == -1) { printf("fcntl F_SETFL error:%d,error msg: = %s\n", errno, strerror(errno)); return -1; } // fcntl(socket, F_SETFL, O_NONBLOCK); // 是否为阻塞版本的socket while(liveplayTaskStatus == RUNNING) { memset(szData, 0, 1280); nLen = recv(socket, szData, HEAD_LEN, 0); if(nLen < HEAD_LEN || nLen == -1) { printf("nLen < HEAD_LEN errno = %d nLen = %d\n", errno, nLen); goto EXITTHREAD; } memcpy(&header, szData, HEAD_LEN); pheader->sLen = ntohs(pheader->sLen); if(pheader->sLen - HEAD_LEN > 0) { nLen = recv(socket, szData + HEAD_LEN, pheader->sLen - HEAD_LEN, 0); if(nLen < pheader->sLen - HEAD_LEN) { fprintf(stderr, "nLen < nMsgLen -HEAD_LEN\n"); goto EXITTHREAD; } } switch(pheader->sMsgType) { case MSG_TYPE_PASSWORD: // 判断密码 if(!(strncmp(LIVE_CONNECT_KEY_1, (char *)(szData + HEAD_LEN), pheader->sLen - HEAD_LEN)) || !(strncmp(LIVE_CONNECT_KEY_2, (char *)(szData + HEAD_LEN), pheader->sLen - HEAD_LEN))) { int ln = strlen(LIVE_SERVER_VERSION) + strlen(LIVE_MINPLAYER_VERSION) + 4; char bver[40], buffer[100]; int userID = 0; time_t timep; sprintf(bver, "%s %s", LIVE_SERVER_VERSION, LIVE_MINPLAYER_VERSION); sd_header.sData = 0; //密码正确 sd_header.sLen = htons(sizeof(MsgHeader) + ln - 2); send(socket, &sd_header, sizeof(MsgHeader), 0); send(socket, bver, ln - 2, 0); sd_header.sLen = htons(sizeof(MsgHeader) + 4); sd_header.sVer = MSG_VER; sd_header.sMsgType = MSG_TYPE_ID; time(&timep); userID = (int)timep; fprintf(stderr, "------ userId = %x\n", userID); recplayEnv.recUser[userIndex].userID = userID; memcpy(buffer, &sd_header, sizeof(MsgHeader)); memcpy(buffer + sizeof(MsgHeader), &userID, 4); send(socket, buffer, sizeof(MsgHeader) + 4, 0); } else { sd_header.sData = 1; //密码错误 printf("passwd error!!!\n"); send(socket, &sd_header, sizeof(MsgHeader), 0); goto EXITTHREAD; } break; case MSG_TYPE_HEART: DEBUG(DL_DEBUG, gLiveDebug_Level, "liveplay Heat OK!!\n"); break; case MSG_TYPE_USEINFO: DEBUG(DL_DEBUG, gLiveDebug_Level, "MSG_TYPE_USEINFO\n"); break; case MSG_TYPE_ID: DEBUG(DL_DEBUG, gLiveDebug_Level, "MSG_TYPE_ID \n"); break; case MSG_TYPE_BDPROXY: DEBUG(DL_DEBUG, gLiveDebug_Level, "MSG_TYPE_BDPROXY \n"); break; case MSG_TYPE_CTRL: { #if 0 printf("MSG_TYPE_CTRL"); unsigned char type, speed, num; type = *(szData + HEAD_LEN); speed = *(szData + HEAD_LEN + 1); num = *(szData + HEAD_LEN + 2); CameraControl((int)type, (int)speed); #endif } break; default: DEBUG(DL_DEBUG, gLiveDebug_Level, "default Exit !!! pheader->sMsgType = %d \n", pheader->sMsgType); break; } } EXITTHREAD: close(socket); setUserLogout(userIndex); removeRecuserIndex(userIndex); clearRecuserNum(); printf("(((((((((((((((((((((((((((((Exit RecPlayProcess Thread!!!!))))))))))))))))))))))))))))\n"); pthread_detach(pthread_self()); return 0; }
/*********************************************** Connect Connects to a specified port Params port - port to connect to address - address to connect to (ex."204.64.75.73") [timeout] - time to wait for connection [family] - protocol family: AF_INET, AF_AF_IPX, etc. Default AF_INET [sockType] - SOCK_STREAM (TCP) or SOCK_DGRAM (UDP) Default is SOCK_STREAM Return UTE_SOCK_ALREADY_OPEN - socket already open or in use UTE_SOCK_CREATE_FAILED - socket creation failed UTE_SOCK_CONNECT_FAILED - socket connection failed UTE_INVALID_ADDRESS - invalid address UTE_SUCCESS - success UTE_CONNECT_TIMEOUT - connect time out ************************************************/ int CUT_WSThread::Connect(unsigned int port, LPCSTR address, long timeout, int family, int sockType) { int nError = UTE_SUCCESS; if(m_clientSocket != INVALID_SOCKET) return OnError(UTE_SOCK_ALREADY_OPEN); //copy the params //check to see if the domain is a name or address if (inet_addr(address) == INADDR_NONE){ if(GetAddressFromName(address, m_szAddress, sizeof(m_szAddress)) != UTE_SUCCESS) return OnError(UTE_INVALID_ADDRESS); } else strncpy(m_szAddress, address, sizeof(m_szAddress)); //m_nFamily = family; m_nSockType = sockType; //Set up the SockAddr structure memset(&m_clientSocketAddr, 0, sizeof(m_clientSocketAddr)); //clear all m_clientSocketAddr.sin_port = (unsigned short) htons((u_short )port); //port m_clientSocketAddr.sin_family = (short) family; //family m_clientSocketAddr.sin_addr.s_addr = inet_addr(m_szAddress); //address //create a socket m_clientSocket = socket(family, sockType, 0); if(m_clientSocket == INVALID_SOCKET) return OnError(UTE_SOCK_CREATE_FAILED); // switch to nonblocking mode to support timeout if(timeout >= 0) SetBlockingMode(CUT_NONBLOCKING); if( connect(m_clientSocket,(LPSOCKADDR)&m_clientSocketAddr,sizeof(m_clientSocketAddr))==SOCKET_ERROR){ if(WSAGetLastError() == WSAEWOULDBLOCK ) { if(timeout >= 0) { if(WaitForSend(timeout, 0) != CUT_SUCCESS) { SocketClose(m_clientSocket); m_clientSocket = INVALID_SOCKET; return OnError(UTE_CONNECT_TIMEOUT); } SetBlockingMode(CUT_BLOCKING); } //set up the default send are receive time-outs // SetReceiveTimeOut(m_lRecvTimeOut); // SetSendTimeOut(m_lSendTimeOut); // save the remote port // m_nRemotePort = ntohs(m_clientSocketAddr.sin_port); // save the local port SOCKADDR_IN sa; int len = sizeof(SOCKADDR_IN); getsockname(m_clientSocket, (SOCKADDR*) &sa, &len); // m_nLocalPort = ntohs(sa.sin_port); // Call socket connection notification if((nError = SocketOnConnected(m_clientSocket, address)) != UTE_SUCCESS) { SocketClose(m_clientSocket); m_clientSocket = INVALID_SOCKET; } return OnError(nError); } else { // did not have these two lines prior to Feb 11 1999 SocketClose(m_clientSocket); m_clientSocket = INVALID_SOCKET; } return OnError(UTE_SOCK_CONNECT_FAILED); // ERROR: connect unsuccessful } // set up the default send are receive time-outs // SetReceiveTimeOut(m_lRecvTimeOut); SetSendTimeOut(m_lSendTimeOut); // Call socket connection notification if((nError = SocketOnConnected(m_clientSocket, address)) != UTE_SUCCESS) { SocketClose(m_clientSocket); m_clientSocket = INVALID_SOCKET; } return OnError(nError); }