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

C++빌더 Q&A
C++Builder Programming Q&A
[62444] Re:통신 소켓 관련 질문드려요
도라지 [forevermc] 1192 읽음    2010-09-15 11:30
이영섭 님이 쓰신 글 :
: 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;
}
//---------------------------------------------------------------------------


저는 쓰레드 생성해서 서버를 동작시키도록 설계했는데요..
위에 질문자님의 소스를보니 별시리 이상은 없어보이는데요.. 포트를 다른곳에서 쓰고 있는건 아닌지요??
아니면 클라이언트가 죽지않고 계속 접속을 시도해서 걍 넘어가는건 아닌지?

+ -

관련 글 리스트
62430 통신 소켓 관련 질문드려요 이영섭 903 2010/09/14
62444     Re:통신 소켓 관련 질문드려요 도라지 1192 2010/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.