좋아, 이것이 스택 오버플로에 대한 나의 첫 번째 질문이다. 그래서 내가 제대로 묻지 않는다면 그것으로 끝내라.D에서 비동기 소켓
기본적으로 std.socket을 사용하여 일부 비동기 소켓을 코딩하려고하지만 개념이 올바른지 잘 모르는지 확실하지 않습니다. C#에서 비동기 소켓을 사용하여 작업 한 적이 있지만 D에서는 훨씬 낮은 수준 인 것처럼 보입니다. 나는 많은 것을 연구했고 D, C/C++에 대한 많은 코드, 문서 등을 찾아 보았습니다. 그러나 개념을 올바르게 이해할 수 있는지, 그리고 어떤 사례가 있는지 잘 모르겠습니다. 나는 splat을 보았지만 매우 구식이었고 단순한 비동기 소켓 래퍼의 경우 너무 복잡했다.
올바르게 이해했다면 std.socket에 poll() 함수가 없으므로 소켓 (socket) 상태를 폴링하기 위해 select()에서 단일 소켓으로 SocketSet을 사용해야 할 것입니다.
기본적으로 소켓을 처리하는 방법은 소켓의 읽기 상태를 얻기 위해 폴링하는 것이고 성공 (값> 0)이있는 경우 receive()를 호출하여 연결 해제를 위해 0을 반환합니다. 받은 값,하지만 예상 된 바이트를받을 때까지 계속해야 할 것입니다.
물론 소켓은 비 차단으로 설정되었습니다!
맞습니까?
여기에 지금까지 작성한 코드가 있습니다.
void HANDLE_READ()
{
while (true)
{
synchronized
{
auto events = cast(AsyncObject[int])ASYNC_EVENTS_READ;
foreach (asyncObject; events)
{
int poll = pollRecv(asyncObject.socket.m_socket);
switch (poll)
{
case 0:
{
throw new SocketException("The socket had a time out!");
continue;
}
default:
{
if (poll <= -1)
{
throw new SocketException("The socket was interrupted!");
continue;
}
int recvGetSize = (asyncObject.socket.m_readBuffer.length - asyncObject.socket.readSize);
ubyte[] recvBuffer = new ubyte[recvGetSize];
int recv = asyncObject.socket.m_socket.receive(recvBuffer);
if (recv == 0)
{
removeAsyncObject(asyncObject.event_id, true);
asyncObject.socket.disconnect();
continue;
}
asyncObject.socket.m_readBuffer ~= recvBuffer;
asyncObject.socket.readSize += recv;
if (asyncObject.socket.readSize == asyncObject.socket.expectedReadSize)
{
removeAsyncObject(asyncObject.event_id, true);
asyncObject.event(asyncObject.socket);
}
break;
}
}
}
}
}
}
감사합니다. 이것은 정확히 내가 찾던 답변 유형입니다! – Bauss