// // Copyright (c) 2013 _iTo_ // #pragma comment(lib, "ws2_32.lib") #include #include "iTerm.h" #ifndef NEGO void iTermStart(pSocketParam sprm) { WSAAsyncSelect(sprm->socket,sprm->hWnd,WM_SOCKET_RECV, FD_READ | FD_CLOSE); } #endif void iTermSend(pSocketParam sprm,boolean nego) { if(send(sprm->socket, (char *)sprm->sendData, sprm->sendDataSize, 0) != SOCKET_ERROR){ #ifdef NEGO if(nego)Sleep(40); #endif WSAAsyncSelect(sprm->socket,sprm->hWnd,WM_SOCKET_RECV, FD_READ | FD_CLOSE); } } void iTermRecv(pSocketParam sprm) { int recvSize; recvSize = recv(sprm->socket, (char *)sprm->recvData, SOCK_BUFF_SIZE, 0); if (recvSize == SOCKET_ERROR){ WSAGetLastError(); }else{ sprm->recvDataSize = recvSize; WSAAsyncSelect(sprm->socket,sprm->hWnd,WM_SOCKET_RECV, FD_READ | FD_CLOSE); } } void iTermClose(pSocketParam sprm) { shutdown(sprm->socket, SD_BOTH); closesocket(sprm->socket); } int iTermLogin(HINSTANCE hInst, pSocketParam sprm) { int ret = 99; WSADATA wsaData; SOCKADDR_IN saddr; int oob = 1; DialogBox(hInst, MAKEINTRESOURCE(IDD_REGISTER), sprm->hWnd, (DLGPROC)ipAdressProc); if(strlen(ipAdressString)>0 && strlen(ipPortString)>0){ if(WSAStartup(MAKEWORD(2,0), &wsaData) == 0){ sprm->socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); setsockopt(sprm->socket,(int)SOL_SOCKET,SO_OOBINLINE,(const char *)&oob,sizeof(oob)); // 帯域外(OOB)データの受信を有効にします WSAAsyncSelect(sprm->socket,sprm->hWnd,WM_SOCKET_INIT, FD_CONNECT); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = inet_addr(ipAdressString); saddr.sin_port = htons(atoi(ipPortString)); ZeroMemory(saddr.sin_zero,8); ret = WSAConnect(sprm->socket,(LPSOCKADDR)&saddr,sizeof(saddr),NULL,NULL,NULL,NULL); if (ret == SOCKET_ERROR){ if (WSAGetLastError() == WSAEWOULDBLOCK){ /* ソケットがブロック (WSAEWOULDBLOCKはエラーとしない) */ ret = 0; } } if (ret != 0){ //PostMessage(sprm->hWnd, WM_SOCKET_INIT,0, MAKELONG(FD_CONNECT,ret)); WSACleanup(); } } } return ret; }