Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
TcpConnector.cpp
[詳解]
1// ----------------------------------------------------------------------------
6
7#include "pch.h"
8#include "TcpConnector.h"
9
10using namespace alt;
11
13 SOCKET socket, LPCTSTR lpctszAcceptIPAddress, USHORT wAcceptPort)
14{
15 _socket = socket;
16 ZeroMemory (_tszAcceptedIPAddress, INET_ADDRSTRLEN);
17 CopyMemory (_tszAcceptedIPAddress, lpctszAcceptIPAddress,
18 _tcslen (lpctszAcceptIPAddress) * sizeof (TCHAR));
19 _wAcceptedPort = wAcceptPort;
20 SecureZeroMemory ((PVOID)&_RecvOverlapped, sizeof (_RecvOverlapped));
21}
22
23INT TcpConnector::Send (LPVOID lpvBuf, DWORD dwSize) const
24{
25 int ret = ::send (_socket, (PCHAR)lpvBuf, (int)dwSize, 0);
26
27 return ret;
28}
29
30INT TcpConnector::Recv (LPVOID lpvBuf, DWORD dwSize, BOOL isBlocking)
31{
32 INT ret = INT_MIN;
33 WSABUF DataBuf;
34 DWORD dwRecvBytes;
35 DWORD dwFlags = 0;
36 DWORD dwRemain = dwSize;
37
38 _RecvOverlapped.hEvent = ::WSACreateEvent ();
39 if (_RecvOverlapped.hEvent == nullptr)
40 {
41 ret = -1;
42 return ret;
43 }
44
45 while (dwRemain!= 0)
46 {
47 int rc;
48 PCHAR currentPos = (PCHAR)lpvBuf + (dwSize - dwRemain);
49 DataBuf.len = dwRemain;
50 DataBuf.buf = currentPos;
51
52 rc = WSARecv (_socket, &DataBuf, 1, &dwRecvBytes, &dwFlags,
53 &_RecvOverlapped, nullptr);
54 if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != GetErrNo ()))
55 {
56 ret = -2;
57 break;
58 }
59
60 rc = WSAWaitForMultipleEvents (1, &_RecvOverlapped.hEvent, TRUE,
61 INFINITE, TRUE);
62 if (rc == WSA_WAIT_FAILED)
63 {
64 ret = -3;
65 break;
66 }
67
68 rc = WSAGetOverlappedResult (_socket, &_RecvOverlapped, &dwRecvBytes,
69 FALSE, &dwFlags);
70 if (rc == FALSE)
71 {
72 ret = -4;
73 break;
74 }
75
76 rc = WSAResetEvent (_RecvOverlapped.hEvent);
77 if (rc == FALSE)
78 {
79 ret = -5;
80 break;
81 }
82
83 if (isBlocking)
84 {
85 dwRemain -= dwRecvBytes;
86 ret = dwSize - dwRemain;
87 if (dwRecvBytes == 0)
88 {
89 ret = 0;
90 break;
91 }
92 }
93 else
94 {
95 ret = (INT)dwRecvBytes;
96 break;
97 }
98 }
99
100 if (WSACloseEvent (_RecvOverlapped.hEvent) == FALSE)
101 {
102 ret = -6;
103 }
104
105 return ret;
106}
107
109{
110 return ::WSASetEvent (_RecvOverlapped.hEvent);
111}
TCP通信に関するWindowsAPIを集約したクラス
プリコンパイル済みヘッダー ファイルです。
DWORD APIENTRY GetErrNo() const
WinSock API呼び出し時にエラーとなった時、 エラーの詳細を返します。
SOCKET _socket
このクラスで管理するソケットオブジェクト
Definition: SocketLibrary.h:63
APIENTRY TcpConnector()=delete
INT APIENTRY Recv(LPVOID lpvBuf, DWORD dwSize, BOOL isBlocking=TRUE)
TCP受信処理
BOOL CancelRecv()
Recv()待機中のキャンセル処理
WSAOVERLAPPED _RecvOverlapped
Definition: TcpConnector.h:59
TCHAR _tszAcceptedIPAddress[INET_ADDRSTRLEN]
Definition: TcpConnector.h:57
INT APIENTRY Send(LPVOID lpvBuf, DWORD dwSize) const
TCP送信処理
Definition: DBLibrary.h:12