프랑스 쪽에서 제공 받은 자료 입니다.
원본 프로젝트는 c++builder 2007로 작성 되었으며 현재 c++builder 11.2 버전으로 코드 수정 및 번역하였고
컴파일에 이상없습니다.
내용 한번 참고 하시어 활용하여도 좋을 듯 합니다.
void AcceptThread::InitClient(ClientContext *client) {
HANDLE hTemp;
char messlog[512];
int flag = 1;
int ret; //,skt=0,size;
DWORD dwBytes = 0, dwFlags = 0;
bool bSucces;
ClientList->Lock();
__try {
bSucces = ClientList->AddClient(client);
} __finally {
ClientList->UnLock();
}
if (!bSucces) {
closesocket(client->Socket);
delete client;
return;
}
hTemp =
CreateIoCompletionPort((HANDLE)client->Socket, hIOCP, (DWORD)client, 0);
if (hTemp != NULL)
strcpy(messlog, "Client added to IOCP port.");
else
strcpy(messlog, "Client not added to IOCP port.");
// PostMessage(GetHandle(),LG_LOG,0,(DWORD)&messlog);
DWORD dwflag = 0, dwbytes;
ret = 4096;
/* setsockopt(client->Socket, SOL_SOCKET, SO_SNDBUF, (char *)&ret,
(int)sizeof(ret))
; setsockopt(client->Socket, SOL_SOCKET, SO_RCVBUF, (char *)&ret,
(int)sizeof(ret))
; */
setsockopt(client->Socket, /* socket affected */
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(char *)&flag, /* the cast is historical
cruft */
sizeof(int)); /* length of option value */
// size=sizeof(int);
// getsockopt(client->Socket, SOL_SOCKET, SO_RCVBUF, (char *)&skt, &size);
Entete *tete;
ClientList->Lock();
__try {
if (client->Active == true) {
client->SousMasque = (int)NbOfAccept;
client->Recv_wbuf->buf = client->RecvBuf;
client->Recv_wbuf->len = 0;
client->TotalRecv = sizeof(Entete);
client->RecvCurseur = 0;
client->RecvInUse = true;
ret = WSARecv(client->Socket, client->Recv_wbuf, 1, &dwbytes, &dwflag,
client->Recv_ovp, NULL);
if (ret == SOCKET_ERROR)
if (WSA_IO_PENDING != WSAGetLastError()) {
client->Active = false;
client->RecvInUse = false;
if ((client->SendInUse == false) && (client->RecvInUse == false)) {
PostMessage(CLIENTMANAGER_HANDLE, LG_DELETE, 0, (DWORD)client);
}
}
if (client->ID != 0) {
tete = (Entete *)client->SendBuf;
tete->CMD = CMD_ADD_SERVEUR;
tete->From = 0;
tete->SousMasqueFrom = 0;
tete->Taille = MAX_NAME_LEN;
tete->Dest = client->ID;
tete->SousMasqueDest = client->SousMasque;
CopyBuffer(&client->SendBuf[sizeof(Entete)], ServeurName, MAX_NAME_LEN);
client->SendCurseur = 0;
client->Send_wbuf->buf = client->SendBuf;
client->TotalSend = tete->Taille + sizeof(Entete);
client->Send_wbuf->len = client->TotalSend;
client->SendInUse = true;
ClientList->PushTimeOut(client->TimeOut);
ret = WSASend(client->Socket, client->Send_wbuf, 1, &dwBytes, dwFlags,
client->Send_ovp, NULL);
if (ret == SOCKET_ERROR)
if (WSA_IO_PENDING != WSAGetLastError()) {
client->Active = false;
client->SendInUse = false;
// strcpy(messlog,"erreur d'envoi");
// PostMessage(GetHandle(),LG_LOG,0,(DWORD)&messlog);
if ((client->SendInUse == false) && (client->RecvInUse == false)) {
PostMessage(CLIENTMANAGER_HANDLE, LG_DELETE, 0, (DWORD)client);
}
}
}
}
} __finally {
ClientList->UnLock();
}
NbOfAccept++;
}