쪼갤수있는 방법이 있을까요?
만약에 50바이트 입력을 받았다고 하면
5바이트씩 10개로 쪼개서 저장이 가능할까요?
그 쪼갠것을 다시 합치면 원상태로 나오게 하고싶은데
함수가 따로 존재 하나요?
답변부탁드립니다
memcpy 함수를 써서 크기만큼 복사해서 붙이면 출력할때 나오지를 않네요
다른 뭔가가 있는건지 궁금하네요..
memcpy 로 부분부분 복사해서 잘라내고 다시 그걸 memcpy 로 복사해서 뭉치면 잘 복원됩니다. 혹시 문자열 처리라면 마지막의 '\0' 를 처리 하지 않으신건지 확인해보세요.
메모리 에러가 나네요 이상하게...;;;
gets(SendMessage); char *packet;//실제로 한번에 전송할 패킷 int SendMSGsize=sizeof(SendMessage);//입력받은 메세지의 길이 //SendMessage=(char *)malloc(sizeof SendMessage); for(PacketCount=0;PacketCount<10;PacketCount++) { packet=(char *)malloc(PacketSize);//패킷의 사이즈에 대한 메모리 공간 할당 MSGcount=PacketCount*5; memcpy(&packet[0], &SendMSGsize, 2);//입력받은 메세지의 길이에 대한정보를 싣는다 memset( &packet[2], PacketCount, 1 ); //memcpy(&packet[2], &PacketCount,1); memcpy(&packet[3], SendMessage[MSGcount],5); packet[8]='\0'; strcat(Buffer,packet);//버퍼에 완성된 패킷을 복사한다(NULL값은 사라지니 주의!) free(packet);//잡은 메모리 제거 //ActualSendSize = send( Socket, packet, PacketSize, 0 ); } for(seqcount=0;seqcount<10;seqcount++) { packet=(char *)malloc(PacketSize);//패킷의 사이즈에 대한 메모리 공간 할당 PacketCount=Packetseq[seqcount]; memcpy(&packet[0], &Buffer[PacketCount],8); ActualSendSize = send( Socket, packet, PacketSize, 0 ); free(packet);
이런식으로 짯거든요...
제가봐도 이상하긴 이상한데 뭐가잘못된지를 잘모르겠네요
메세지를 입력하면 메모리 에러가 나고 조금 수정하면 메모리에러는
없어지던데 복원이 안되네요..;;;
음..; 도저히 안되겠다 싶어서 노가다로 완성은 했습니다...;;;
코드가 #include <stdio.h> #include <winsock2.h> #include <string.h>
int strsub(const char * strSource, int nStart, int nCount, char * strTarget);
void main(){ WSADATA wsaData; //ws2_32.dll 초기화 SOCKET ServerSocket; //서버소켓을 선언합니다. SOCKADDR_IN ServerAddress; //소켓의 주소 정보를 넣는 구조체입니다. unsigned short ServerPort = 5001; int AddressSize; SOCKET ClientSocket; //클라이언스 소켓 선언 SOCKADDR_IN ClientAddress; int retval,Pcount;//recv값을 받을 변수 char Buffer[99]; // 버퍼를 잡아줍니다. char MSG[999]; memset(Buffer,0,99);
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) //ws2_32.dll 초기화 { printf( "WSAStartup설정에서 문제 발생..\n" ); WSACleanup(); exit( 0 ); } ServerAddress.sin_family = AF_INET; //반드시 AF_INET이어야합니다. ServerAddress.sin_addr.s_addr = INADDR_ANY; //IP주소값. INADDR_ANY는 알아서 자기주소를... ServerAddress.sin_port = htons( ServerPort ); //포트번호 ServerSocket = socket(AF_INET, SOCK_STREAM,0); ////소켓을 만듭니다.
if( ServerSocket == INVALID_SOCKET ) //에러 발생시 문구 출력. { printf( "소켓을 생성할수 없습니다." ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); }
if( bind(ServerSocket,(struct sockaddr*)&ServerAddress,sizeof(ServerAddress) ) == SOCKET_ERROR ) { printf( "바인드를 할 수 없습니다." ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); }
if( listen(ServerSocket,SOMAXCONN) == SOCKET_ERROR )
{ printf( "listen함수 설정을 실패했습니다..\n" ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); }
AddressSize = sizeof( ClientAddress );
printf( "서버로의 연결을 기다리고 있습니다..\n" );
if( (ClientSocket = accept( ServerSocket,(struct sockaddr*)&ClientAddress , &AddressSize )) == INVALID_SOCKET )
{ printf( "Accept시 문제 발생......\n" ); getchar(); } else { printf("접속 IP %s, 포트 %d.\n", inet_ntoa(ClientAddress.sin_addr), htons(ClientAddress.sin_port)) ;
} while(1){ retval = recv( ClientSocket, Buffer, sizeof Buffer, 0 ); if(retval==-1) { printf("클라이언트가 끊어졌습니다 종료하겠습니다\n"); break; } else { printf("%s",Buffer);
memset(Buffer,0,99);
}
} closesocket( ServerSocket ); //소켓을 닫습니다. WSACleanup(); printf( "서버 프로그램이 종료 되었습니다..\n" ); }
int strsub(const char * strSource, int nStart, int nCount, char * strTarget) { int i, j; // 문자열이 존재하는지 않으면 에러 if( NULL == strSource || NULL == strTarget) { return -1; }
// 인덱스가 음수면 에러 if( 0 > nStart || 0 > nCount) { return -1; }
// 문자열 부분 복사 시작 for(i = nStart, j = 0; j < nCount; ++i, ++j) { if( NULL == strSource[i]) break; strTarget[j] = strSource[i]; } strTarget[j] = NULL; // 문자열 끝에 널집어 넣기.
return j; }
이렇습니다...;
뭐 쓸줄 모르니 몸으로 라도 때워야겠죠..;;;
그럼이만
이제 대충 문자열은 쪼갯으니 문제는 문자열의 순번을 실어야 하는데
참으로 난감하네요..;;
어떻게 실어서 복원할때 확인해야하나..
char 문자열에다가 정수를 저장해도 어떻게 구별해야하나...;;
혹시 아시는분은 답변좀 부탁드리겠습니다... 열씨미 고민중.^_^;;
소스를 제대로 보지는 않았지만
strcat(Buffer,packet);//버퍼에 완성된 패킷을 복사한다(NULL값은 사라지니 주의!)
부분이 좀 걱정되네요..
strcat 는 NULL 까지 복사합니다.
( strcpy 를 쓰지 않은 이유는 뭘까요? )
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
memcpy 로 부분부분 복사해서 잘라내고 다시 그걸 memcpy 로 복
memcpy 로 부분부분 복사해서 잘라내고 다시 그걸 memcpy 로 복사해서 뭉치면 잘 복원됩니다.
혹시 문자열 처리라면 마지막의 '\0' 를 처리 하지 않으신건지 확인해보세요.
메모리 에러가 나네요 이상하게...;;;[code] gets(S
메모리 에러가 나네요 이상하게...;;;
이런식으로 짯거든요...
제가봐도 이상하긴 이상한데 뭐가잘못된지를 잘모르겠네요
메세지를 입력하면 메모리 에러가 나고 조금 수정하면 메모리에러는
없어지던데 복원이 안되네요..;;;
음..; 도저히 안되겠다 싶어서 노가다로 완성은 했습니다...;;;
음..; 도저히 안되겠다 싶어서 노가다로 완성은 했습니다...;;;
코드가
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
int strsub(const char * strSource, int nStart, int nCount, char * strTarget);
void main(){
WSADATA wsaData; //ws2_32.dll 초기화
SOCKET ServerSocket; //서버소켓을 선언합니다.
SOCKADDR_IN ServerAddress; //소켓의 주소 정보를 넣는 구조체입니다.
unsigned short ServerPort = 5001;
int AddressSize;
SOCKET ClientSocket; //클라이언스 소켓 선언
SOCKADDR_IN ClientAddress;
int retval,Pcount;//recv값을 받을 변수
char Buffer[99]; // 버퍼를 잡아줍니다.
char MSG[999];
memset(Buffer,0,99);
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) //ws2_32.dll 초기화
{
printf( "WSAStartup설정에서 문제 발생..\n" );
WSACleanup();
exit( 0 );
}
ServerAddress.sin_family = AF_INET; //반드시 AF_INET이어야합니다.
ServerAddress.sin_addr.s_addr = INADDR_ANY; //IP주소값. INADDR_ANY는 알아서 자기주소를...
ServerAddress.sin_port = htons( ServerPort ); //포트번호
ServerSocket = socket(AF_INET, SOCK_STREAM,0); ////소켓을 만듭니다.
if( ServerSocket == INVALID_SOCKET ) //에러 발생시 문구 출력.
{
printf( "소켓을 생성할수 없습니다." );
closesocket( ServerSocket );
WSACleanup();
exit( 0 );
}
if( bind(ServerSocket,(struct sockaddr*)&ServerAddress,sizeof(ServerAddress) ) == SOCKET_ERROR )
{
printf( "바인드를 할 수 없습니다." );
closesocket( ServerSocket );
WSACleanup();
exit( 0 );
}
if( listen(ServerSocket,SOMAXCONN) == SOCKET_ERROR )
{
printf( "listen함수 설정을 실패했습니다..\n" );
closesocket( ServerSocket );
WSACleanup();
exit( 0 );
}
AddressSize = sizeof( ClientAddress );
printf( "서버로의 연결을 기다리고 있습니다..\n" );
if( (ClientSocket = accept( ServerSocket,(struct sockaddr*)&ClientAddress , &AddressSize )) == INVALID_SOCKET )
{
printf( "Accept시 문제 발생......\n" );
getchar();
}
else
{
printf("접속 IP %s, 포트 %d.\n", inet_ntoa(ClientAddress.sin_addr), htons(ClientAddress.sin_port)) ;
}
while(1){
retval = recv( ClientSocket, Buffer, sizeof Buffer, 0 );
if(retval==-1)
{
printf("클라이언트가 끊어졌습니다 종료하겠습니다\n");
break;
}
else
{
printf("%s",Buffer);
memset(Buffer,0,99);
}
}
closesocket( ServerSocket ); //소켓을 닫습니다.
WSACleanup();
printf( "서버 프로그램이 종료 되었습니다..\n" );
}
int strsub(const char * strSource, int nStart, int nCount, char * strTarget)
{
int i, j;
// 문자열이 존재하는지 않으면 에러
if( NULL == strSource || NULL == strTarget)
{
return -1;
}
// 인덱스가 음수면 에러
if( 0 > nStart || 0 > nCount)
{
return -1;
}
// 문자열 부분 복사 시작
for(i = nStart, j = 0; j < nCount; ++i, ++j)
{
if( NULL == strSource[i]) break;
strTarget[j] = strSource[i];
}
strTarget[j] = NULL; // 문자열 끝에 널집어 넣기.
return j;
}
이렇습니다...;
뭐 쓸줄 모르니 몸으로 라도 때워야겠죠..;;;
그럼이만
이제 대충 문자열은 쪼갯으니 문제는 문자열의 순번을 실어야 하는데
이제 대충 문자열은 쪼갯으니 문제는 문자열의 순번을 실어야 하는데
참으로 난감하네요..;;
어떻게 실어서 복원할때 확인해야하나..
char 문자열에다가 정수를 저장해도 어떻게 구별해야하나...;;
혹시 아시는분은 답변좀 부탁드리겠습니다... 열씨미 고민중.^_^;;
그럼이만
소스를 제대로 보지는 않았지만 strcat(Buffer,pack
소스를 제대로 보지는 않았지만
strcat(Buffer,packet);//버퍼에 완성된 패킷을 복사한다(NULL값은 사라지니 주의!)
부분이 좀 걱정되네요..
strcat 는 NULL 까지 복사합니다.
( strcpy 를 쓰지 않은 이유는 뭘까요? )
댓글 달기