|
소스를 보니 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 );
: }
|