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
[29287] Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요...
수야!╋ [sooya23] 3942 읽음    2004-04-07 13:51
전송시에도 문제가 있는거 같은데요

전송하는 부분을 함 손봐보죠~

typedef struct MY_STRUCT
{
  int a;
  char b[100];
} My_Struct, *PMY_STRUCT;

SOCKET Sock = (SOCKET) arg;

My_Struct MyStruct;

MyStruct.a = 100;
memcpy(MyStruct.b, "아싸라비아", strlen("아싸라비아"));

char *pSendBuffer = (char*)&MyStruct;
int nSendCompliteSize = 0;
int nRequestSendSize = (sizeof(int) + strlen("아싸라비아"));

// 보낼것이 있으면 보내라
while(nRequestSendSize)
{
  nSendCompliteSize = send(sock, pSendBuffer, nRequestSendSize, 0);

  if(nSendCompliteSize > 0) // 0보다 작으면 전송실패이며 에러체크를 해야됩니다.
  {
    nRequestSendSize -= nSendCompliteSize; // 보내기 요청할 크기를 보낸크기만큼 빼줍니다.
    pSendBuffer += nSendCompliteSize; // 버퍼의 포인터를 보낸만큼 이동시켜줍니다.
  }
}

포인터를 이동한 변수는 직접적으로 사용한 MyStruct의 포인터가 아니기때문에
전송이 완료된 이후에는 원위치로 돌려주지 않아도 됩니다.
다만 pSendBuffer는 while문을 빠져나오면 MyStruct의 마지막 주소 번지에 위치해 있을겁니다.

소켓의 버퍼가 찼을경우에는 send에서 1이 리턴되는수도 있습니다.
물론 0이 리턴되는 경우도 있는데 이때는 에러체크를 하여 에러원인을 확인하여 대처해야합니다.

strlen("아싸리비아") 는 10 이며 sizeof("아싸라비아") 는 11입니다.
이유는 strlen은 \n을 포함하지 않은것이며 sizeof는 \n을 포함한 것이기 때문이죠

패킷전송이라면 굳이 \n을 보내지 않아도 됩니다.

수정부분의 원소스에 대한 주석을 좀 달았습니다.

struct MY_STRUCT{
                   int a;
                   char b[100];
                };
typedef MY_STRUCT *PMY_STRUCT;

// 위와같이 두번 선언할 필요는 없어용~

보내는 부분에서
SOCKET sock = (SOCKET)arg;

char  buf[4096] = {0,};

// buf를 통해서 보낼것도 아닌데 쓸데없는 낭비입니다.
PMY_STRUCT pMyStruct=  (PMY_STRUCT)buf;

//값입력
pMyStruct->a = 100;

memcpy(pMyStruct->b,"어쩌구~", sizeof("어쩌구~") );
// 문자열의 경우에는 strcpy를 사용하시는게 더 좋아요 별 큰차이는 없지만 ㅋㅋ

//보내기
int cch = sizeof(MY_STRUCT); // 변수명이 무의미 해요~
// 어쩌구 이외의 값은 보낼 필요가 없는데 보내는군요

send(sock, (const char *)&pMyStruct, cch, 0);

수야!╋였습니다.

수야!╋ 님이 쓰신 글 :
:     int strLen;
:      char nameMessage[NAMESIZE + BUFSIZE]; // 뭐 네임싸이즈 가 뭔진 모르겠지만
:
:      // (char *)nameMessage을 다르게 써야하는지요
:      strLen = recv( sockTemp, (char *)nameMessage, NAMESIZE + BUFSIZE - 1, 0 );
:
: char nameMessage[(NAMESIZE + BUFSIZE)];
: 이 문장은
: char *nameMessage = (char*) malloc((NAMESIZE + BUFSIZE));
: 로 바꿀수 있는데요
: 왜 이 이야기를 하냐면
:
: recv펑션의 인자들은 SOCKET, char*, int, Flag);이죠?
: char*를 char*로 변환시키면 -_-; 안댄다는거지여~
: 그냥 nameMessage라고 해주시면되구용
:
: 젤 위험하게 보이는게 NAMESIZE + BUFSIZE -1 이라는 부분이네요
: NAMESIZE + BUFSIZE - 1만큼 받으라고 해도 그만큼 받지 못하는 경우의 대비는 어떻게 하시는지요?
:
: ^^ 힘내세요~
:
: 구리구리 님이 쓰신 글 :
: : 네 수야님 감사합니다
: : 그런데 받는부분에서 제가 뭘 잘못햇는지 잘 안되네요
: :
: : 보내고 받는 부분에 둘다 아래와 같은 구조체가 있습니다
: : struct MY_STRUCT{
: :                   int a;
: :                   char b[100];
: :                 };
: : typedef MY_STRUCT *PMY_STRUCT;
: :
: : 보내는 부분에서
: : SOCKET sock = (SOCKET)arg;
: :
: : char  buf[4096] = {0,};
: :
: : PMY_STRUCT pMyStruct=  (PMY_STRUCT)buf;
: :
: : //값입력
: : pMyStruct->a = 100;
: :
: : memcpy(pMyStruct->b,"어쩌구~", sizeof("어쩌구~") );
: :
: : //보내기
: : int cch = sizeof(MY_STRUCT);
: :
: : send(sock, (const char *)&pMyStruct, cch, 0);
: : 이렇게 했고요
: :
: :
: : 받는 부분은 이렇거든요
: : PMY_STRUCT pMyStruct=  (PMY_STRUCT)buf;
: :
: : while (1)
: : {
: :     SOCKET sockTemp = accept( g_sockListen, NULL, NULL );
: :     // 소켓 에러 체크
: :     if( INVALID_SOCKET == sockTemp )
: :     {
: :         printf("연결된 소켓 에러");
: :         return 0;
: :     }
: :
: :         printf("Socket number %d connected\n",sockTemp);       
: :
: :     int strLen;
: :     char nameMessage[NAMESIZE + BUFSIZE];
: :
: :     // (char *)nameMessage을 다르게 써야하는지요
: :     strLen = recv( sockTemp, (char *)nameMessage, NAMESIZE + BUFSIZE - 1, 0 );
: :
: :     if (strLen == -1 )
: :         return 1;
: :
: :     //  받을때 구조체를 받아서 여기 있는 구조체에 복사해서
: :     // 써야 하는건지 잘모르겠네요
: :     nameMessage[strLen] = 0;
: :     printf("%s\n", nameMessage);
: : }
: :
: :
: : 결과 값이
: : | ?
: : 위 처럼 나오네요 뭔가 빼먹은듯 한데...
: : 얼마전부터 패킷 보내는걸 해보려는데 잘 안되네요
: : 제발 갈켜주세요  ㅠ,.ㅠ

+ -

관련 글 리스트
29281 [질문]패킷을 구조체로 전송하는 방법이요... 구리구리 1300 2004/04/07
29290     Re:제가 알기로는 ..... ^^; 푸른노래 1405 2004/04/07
29288     Re:[질문]패킷을 구조체로 전송하는 방법이요... 손병찬 1881 2004/04/07
29283     Re:[질문]패킷을 구조체로 전송하는 방법이요... 수야!╋ 1609 2004/04/07
29285         Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 구리구리 1310 2004/04/07
29286             Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 수야!╋ 1241 2004/04/07
29287                 Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 수야!╋ 3942 2004/04/07
34795                     Re:Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 박정진.바보 2119 2004/04/08
34794                     Re:Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 구리구리 1179 2004/04/08
34793                     Re:Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 수야!╋ 1193 2004/04/07
34792                         Re:Re:Re:Re:Re:Re:[질문]패킷을 구조체로 전송하는 방법이요... 수야!╋ 1247 2004/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.