이영섭 님이 쓰신 글 :
: 1:1 통신 프로그램을 짜고있는데, 서버쪽이 쉽지 않네요.
: 분면 Accept하는 부분에서 기다려야하는데 지 멋대로 내려가곤 하는데, 이거 어떻게 막을수 없을까요?
: 컴퓨터 한대로 테스트하는거라 IP 및 포트가 열려있어서 이렇게 멋대로 내려가는건지 모르겠어요.
: 잘 되다가 가끔씩 대기하지않고 혼자 내려가는데 도저히 모르겠네요;;;
:
: 뭔가 감잡히시는 분들은 조언좀 해주세요.
:
: 개발툴은 볼랜드 2010을 썼습니다.
:
: main
: {
: byte *rcvbuf;
:
: SOCKADDR_IN client_addr;
: WinSockInitial();
: ssock = OpenTCPSocket();
: BindSocket(ssock, 9010);
:
: while(isWork)
: {
:
: if(!SocketListenTCP(ssock))
: {
: ShowMessage("실패");
: return;
: }
: 1>> csock = accept(ssock, (SOCKADDR*)&client_addr, &clen); // 반응있음
: if(csock > 1000000)
: {
: SockClose(csock);
: continue;
: }
: // Receive
: nRecvPacketSize = 9; //sizeof(cmdMessage);
: rcvbuf = (Byte*)malloc(nRecvPacketSize);
: memset(rcvbuf, 0x00,nRecvPacketSize);
:
: if(listen(ssock, 5) == SOCKET_ERROR)
: {
: ShowMessage("ERROR");
: }
:
: int nRecvCount = ReceiveTCPData(csock, (char*)rcvbuf,
: nRecvPacketSize, -10);
:
: int length = strlen(rcvbuf);
: if(length <= 0)
: {
: Sleep(1);
: continue;
: }
: }
void __fastcall TForm1::Timer1Timer(TObject * sender)
{
TCP_StartUP(&sock, PORT, &servAddr, &wsaData);
if (_thread1 == NULL)
_thread1 = new TThread1(this, true); // TRUE값 -> 대기.. FALSE -> 실행
_thread1->Priority = tpNormal; // 쓰레드 우선순위.
if (_thread1->Suspended)
_thread1->Resume(); // 대기중이면.. 실행한다..
}
void __fastcall TForm1::TCP_StartUP(SOCKET *servSock, int port, SOCKADDR_IN *servAddr, WSADATA *wsaData)
{
if(WSAStartup(MAKEWORD(2, 2), wsaData) != 0) /* Load Winsock 2.2 DLL */
{
dbg.printf("WSAStartup() error!\n");
return;
}
hMutex=CreateMutex(NULL, FALSE, NULL);
if(hMutex==NULL){
dbg.printf("CreateMutex() error\n");
return;
}
*servSock=socket(PF_INET, SOCK_STREAM, 0);
if(*servSock == INVALID_SOCKET)
{
dbg.printf("socket() error\n");
return;
}
memset(servAddr, 0, sizeof(servAddr));
servAddr->sin_family=AF_INET;
servAddr->sin_addr.s_addr=htonl(INADDR_ANY);
servAddr->sin_port=htons(port);
if(bind(*servSock, (SOCKADDR*) servAddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
dbg.printf("bind() error\n");
return;
}
if(listen(*servSock, 5)==SOCKET_ERROR)
{
dbg.printf("listen() error\n");
return;
}
}
//-----------------------------------------------------------------------------------
void __fastcall TThread1::Execute()
{
int clntAddrSize;
SOCKET clntSock;
SOCKADDR_IN clntAddr;
HANDLE hThread;
unsigned dwThreadID;
while(Form1->whileflag)
{
if (Form1->whilestopflag)
{
Form1->whileflag = 0;
continue;
}
if (Form1->acceptflag)
{
clntAddrSize=sizeof(clntAddr);
clntSock=accept(form->sock, (SOCKADDR*)&clntAddr, &clntAddrSize);
if(clntSock==INVALID_SOCKET)
{
WaitForSingleObject(form->hMutex, INFINITE);
form->ErrorHandling("accept() error");
ReleaseMutex(form->hMutex);
}else
{
Form1->acceptflag = 0;
dbg.printf("Accept ok %d\n",clntSock);
}
WaitForSingleObject(form->hMutex, INFINITE);
form->clntSocks[form->clntNumber++]=clntSock;
ReleaseMutex(form->hMutex);
hThread = (HANDLE)_beginthreadex(NULL, 0, ClientConn, (void*)clntSock, 0, (unsigned *)&dwThreadID);
if(hThread == 0)
{
WaitForSingleObject(form->hMutex, INFINITE);
form->ErrorHandling("쓰레드 생성 오류");
ReleaseMutex(form->hMutex);
}
}
::Sleep(500);
}
Form1->cancloseflag = 1;
Form1->Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
저는 쓰레드 생성해서 서버를 동작시키도록 설계했는데요..
위에 질문자님의 소스를보니 별시리 이상은 없어보이는데요.. 포트를 다른곳에서 쓰고 있는건 아닌지요??
아니면 클라이언트가 죽지않고 계속 접속을 시도해서 걍 넘어가는건 아닌지?