|
코드가 메세지 처리 부분만 있어서 모르겠네요.
비슷한게 있어서 첨부파일로 올릴게요.
Indy 소켓 예제를 참고하였습니다. (같은 내용이 있더군요)
서버와 클라이언트를 하나로 합쳐논거고,
개인 작업시에 Synergy, 원격데스크탑 등을 오가며 클립보드 공유가 가끔 안되서
개인용도의 텍스트 공유용으로 만든거라 매끄럽지 않은 동작도 있고 예외처리 안했는데
기능은 동작하니 참고하셔요~
서버는 포트 설정해 열고
클라이언트는 IP/Port 설정해서 접속하며 각각 타이핑하는 문자열이 서버와 접속된 클라이언트 모두에게 뿌려집니다.
DoyongID 님이 쓰신 글 :
: 채팅서버에 클라이언트 2대를 물려서 메시지를 주고받고 있습니다..
:
: A클라이언트가 메시지 보내면 서버에서 받아서, A,B에게 전송하고,
: B클라이언트가 메시지에 보내면 역시 서버에서 A,B에게 다시 전송하는 방식인데요..
:
: 각 클라이언트가 1ms마다 메시지를 보냅니다..
:
: 그런데, 이 과정에서 A클라이언트의 접속을 해제하면 B클라이언트 접속도 해제되거든요.. 어디가 문제인지 모르겠습니다. 동기화 문제인가 싶어서 크리티컬섹션도 먹였는데, 마찬가지고..
:
: void __fastcall TWin_Main::TCPServerExecute(TIdContext *AContext)
: {
: TByteDynArray Buffer;
: PACKET_RECVCHAT stRecvPacket;
: PACKET_SENDCHAT stSendPacket;
: BYTE Cmd;
:
: TIdContext *lpContext;
:
: EnterCriticalSection(&Cs);
:
: Cmd = AContext->Connection->IOHandler->ReadChar();
:
: switch(Cmd)
: {
: case CMD_CHAT:
: AContext->Connection->IOHandler->ReadBytes(Buffer, sizeof(PACKET_RECVCHAT), false);
: BytesToRaw(Buffer, &stRecvPacket, sizeof(PACKET_RECVCHAT));
:
: ListBox_Info->ItemIndex = ListBox_Info->Items->Count - 1;
:
: stSendPacket.Cmd = CMD_CHAT;
: strcpy(stSendPacket.Str, stRecvPacket.Str);
:
: Buffer = RawToBytes(&stSendPacket, sizeof(PACKET_SENDCHAT));
:
: TList *LockList = TCPServer->Contexts->LockList();
:
: try
: {
: for(int i = 0; i < LockList->Count; i++)
: {
: lpContext = (TIdContext *)(LockList->Items[i]); // get client-object
:
: if(lpContext->Connection->IOHandler->Connected())
: lpContext->Connection->IOHandler->Write(Buffer);
: }
: }
: __finally
: {
: TCPServer->Contexts->UnlockList();
: LeaveCriticalSection(&Cs);
: }
: }
: }
|