이거 제가 전에 돌리던 서버는 비동기가 아니어서
서버에 접속할때 connect 블록돼서 시간 지체되는거때문에 ioctlsocket으로 300ms 타임아웃 걸고 connect 해서 리턴값 확인으로 접속 성공 여부 체크했는데
이 비동기 서버는 이것저것 해봤는데 이렇게 하니 잘 되는데 맞는 방법인지 봐주세요
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | bool ConnectToServer(const char *host, int port) { SOCKET hSock; u_long ipaddr; struct hostent *h; SOCKADDR_IN servAdr; FD_SET fds; struct timeval tv; if ((ipaddr = inet_addr(host)) == INADDR_NONE) if ((h = gethostbyname(host)) != NULL) ipaddr = *(u_long *)h->h_addr; hSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); ioctlsocket(hSock, FIONBIO, (u_long*)""); memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET; servAdr.sin_addr.s_addr = ipaddr; servAdr.sin_port = htons((u_short)port); FD_ZERO(&fds); FD_SET(hSock, &fds); tv.tv_sec = 0; tv.tv_usec = 300000; //300ms connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr)); ioctlsocket(hSock, FIONBIO, (u_long*)""); select(0, 0, &fds, 0, &tv); if (!FD_ISSET(hSock, &fds)) { closesocket(hSock); return false; } closesocket(hSock); //성공했어도 소켓 다시 만들어서 connect 하기 위해 닫음 hSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (WSAAsyncSelect(hSock, g_hWnd, WM_SOCKET, FD_READ | FD_CLOSE | FD_CONNECT) == SOCKET_ERROR) { closesocket(hSock); return false; } if (connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) != SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) { closesocket(hSock); return false; } g_clntSock = hSock; return true; } | cs |
겁나 오랜만에 뷰리파이어 쓴 사람이 나타났다. 모두 이 사람을 도와줘!
ㅋㅋㅋㄳㄳ
워 코드 스타일이 내 예전 스타일이다. 반갑넹 ㅋㄷㅋㄷ 깔끔하게 짜시는군용~
코드 하나 하나 따라가긴 귀찮고 그냥 boost::asio 쓰는게 낫지 않을까유? 리눅스나 맥, 모바일도 지원하게
엌ㅋㅋ 칭찬을 받다니.. 아직 고딩입니당
윈도우에서만 돌아가는 클라이언트라 .. vs2015환경에서 c로 만들었구요
거기선 deadline_timer 로 시간 정해 놓고 socket 닫아버릴 수 있어서 time_out 처리는 직관적으로 됨.
boost는 뭐죠?C++같은데.. 이해가 잘
응 C++ 라이브러리 모음. 소스 공개된 라이브러리야. 대개 헤더파일의 template 구문으로 되어 있엉
헉 아직 C++ 을 공부하지 않은거냐..
C만 3년 해가지고요 ㅋㅋ; 근데 저렇게 connect 두번 하는게 최선인가요?
왜 닫지?
아 connect 먼저 하고 정상 업속 됐으면 WSAAsyncSelect 호출하고 함수 나와서 다음줄에 서버로 패킷 보내는 코드 적으면 되네요
업속이 아니고 접속
원랜 FD_CONNECT 오면 패킷날렸었는데 그 부분을 ConnectToServer() 밑에 적으면 되네요 ㄳㄳ
c++ 편할려고 쓰는거니 짬짬이 공부해두세융.