C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 자료실
C++Builder Programming Resources
[736] C++builder 로 작성된 IOCP server & client 입니다.
사탄 [kdhs] 1532 읽음    2022-12-01 21:47




프랑스 쪽에서 제공 받은 자료 입니다.

원본 프로젝트는 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++;
}



그 아이 [tsirorret]   2022-12-02 08:41 X
좋은 자료 감사합니다. 지난번 프로젝트에서 사용하려다 컴파일 문제로 사용하지 못했는데...이거 보고 뭐가 문제 였는지 확인해 봐야 겠습니다.
Bass Angler [palindrome]   2022-12-02 16:29 X
server 쪽 structure.h 파일이 없는데.. 컴파일이 되나요?
사탄 [kdhs]   2022-12-02 17:11 X
어우... 작업하던거랑 분리해서 따로 저장하다가 누락되었네요,

파일을 다시 확인하여 업로드 하였습니다.

+ -

관련 글 리스트
736 C++builder 로 작성된 IOCP server & client 입니다. 사탄 1532 2022/12/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.