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
[61756] Re:tcp/ip 연결은 되는데 전송이 안돼여...
땅주인 [heaven2] 1451 읽음    2010-07-01 17:24
소스를 보니 Win32 Socket이네요
보내는 것은 괜찮을 것 같은데..
수신은 어떻게 하고 있나요? Win32 소켓이라면
수신 단에서 계속 수신이 있는 지 계속 검사를 해야 하는데..그렇게 하고 있는 지요?
수신 쪽에서는 socket의 수신 버퍼를 계속 읽고 뭔가 들어온 게 있으면 , socket에서 읽어서..
사용하면 됩니다. 또 송신 측에서 보낸 것이 한 번 읽었을 때 모두 수신된다는 보장이 없으니
이 또한 루프를 돌면서 지정된 사이즈만 큼 읽을 때까지 모두 읽어야 하고..
그 이후 사용해야 합니다. 이래 저래 처리해야 할 것들이 많지요.

꼭 Win32 API를 써야 한다면 모르겠지만,
MFC 소켓을 쓰거나 해서 소켓에서 수신된 것이 있으면 event로 알려주는 형태로
제작을 해도 무난할 듯 하네요.
...
라고 옆에 있는 개발자가 그랬습니다. :)


초짜~ 님이 쓰신 글 :
: tcp/ip client 프로그램을 짜고 있는데
:
: 연결은 되는데, send를 하면 받는 쪽에서는 아무런 반응이 없습니다.
:
: 고수들의 한 수를 기대합니다.
:
: 몇일째 고생하고 있습니다.
:
: =========<source>======================
:     WORD wVersionRequested;
:     WSADATA wsaData;
:     wVersionRequested = MAKEWORD( 2, 2 );
:     WSAStartup(MAKEWORD(2,2), &wsaData);
:
:     SOCKET socket;
:
:     unsigned int addr;
:     int socket_type = SOCK_STREAM;
:     struct sockaddr_in server;
:     struct hostent *hp;
:     LPSTR server_name = _ipAddress.c_str();
:     if(isalpha(server_name[0]))
:     {
:         hp = gethostbyname(server_name);
:         if(hp == NULL) return ;
:         memcpy((char *)&addr, hp->h_addr, hp->h_length);
:     }
:     else
:     {
:         addr = inet_addr(server_name);
:     }
:
:     memset(&server,0,sizeof(server));
:     server.sin_addr.s_addr = addr;
:     server.sin_family = AF_INET;
:     server.sin_port = htons(_port);
:     BOOL bZero = TRUE;
:     int nZero = 0;
:     int nInterval = 1000;
:
:     try
:     {
:         socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
:         int nRet = setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char *)&bZero, sizeof(BOOL));
:         nRet = setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char *)&nZero, sizeof(int));
:         nRet = setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO,    (char *)&nInterval, sizeof(int));
:         if (connect(socket,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR )
:         {
:             strLog.printf("\t[소켓 생성실패] (IP:%s)\t (PORT:%d)", _ipAddress, _port);
:             return ;
:         }
:         strLog.printf("\t[소켓 생성] (IP:%s)\t (PORT:%d)", _ipAddress, _port);
:     }
:     catch(...)
:     {
:         closesocket(socket);
:         return ;
:     }
:
:     try
:     {
:         // CCTV로 패킷 전송
:         int nErr = 0;
:         DWORD dwSendNumBytes = 0;
:         DWORD dwSendLen = 0;
:         if(socket != INVALID_SOCKET)
:         {
:             DWORD dwFlags = 0;
:             WSABUF wsaBuf;
:             wsaBuf.buf = (char *) (sMsgSndCCTV.c_str());
:             wsaBuf.len = sMsgSndCCTV.Length();
:             nErr = WSASend(socket, &wsaBuf, 1, &dwSendNumBytes, dwFlags, NULL, NULL);
:             if (nErr == SOCKET_ERROR)
:             {
:                 strLog.printf("\t CCTV 전송실패");
:             }
:             else
:             {
:                 strLog.printf("\t CCTV 전송완료");
:                 char chrMsgRcvCCTV[1000];
:                 memset( chrMsgRcvCCTV, 0x00, 1000 );
:                 DWORD dwFlag = 0;
:                 DWORD dwRead;
:
:                 WSABUF wsabuf;
:                 wsabuf.buf = chrMsgRcvCCTV;
:                 wsabuf.len = 1;
:
:                 nErr = WSARecv(socket, &wsabuf, 1, &dwRead, &dwFlag, NULL, NULL);
:
:                 if(nError == SOCKET_ERROR && (WSA_IO_PENDING!=WSAGetLastError()))
:                 {
:                     return SOCKET_ERROR;
:                 }
:
:                 if ( nErr == 0 )
:                 {
:                     sMsgRcvCCTV = *chrMsgRcvCCTV;
:                     strLog.printf("\tCCTV에서 받은 메세지 : %s", sMsgRcvCCTV);
:                 }
:                 else
:                 {
:                     strLog.printf("\tCCTV 수신 오류");
:                 }
:             }
:         }
:     }
:     catch(Exception &E)
:     {
:         strLog.printf("\t송신 에러: %s\r\n", E.Message );
:     }

+ -

관련 글 리스트
61748 tcp/ip 연결은 되는데 전송이 안돼여... 초짜~ 1448 2010/07/01
61756     Re:tcp/ip 연결은 되는데 전송이 안돼여... 땅주인 1451 2010/07/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.