バイナリデータの送信
Posted: 2010年9月17日(金) 13:31
TCPソケットでバイナリデータを贈りたいと思います。
そのままでは良くないと思い一応,送るバイナリデータは
簡易的に暗号にしたいともいます。
復号化のためデータの区切りをはっきりさせないといけないので
データの最初に"a"最後に"z"を付けておくります。
例)
dataという文字(テキストですが、バイナリだと思ってください)を送る場合
a(dataをXORで暗号にしたもの)z
というデータを送り、受信側で解析してdataというデータを受け取りたいのです。
以下のコードではテキストデータの送信は成功したのですが、
バイナリデータになると、おかしなデータが送られているようでした。
何か解決方法はありますか?
それとも根本からおかしいのでしょうか?
//送信側
sendex(SOCKET s,char FAR * buf, int len,int flags )
{
int i,ret,n=0;
char msg[4000];
memset(msg,'\0',4000);
//XORを用いて簡易的に暗号にする
for(i = 0; i < strlen(buf); i++) buf = ~buf;
//データの始まりに"a"、終に"z"を書き込み、区切りとして使う
strcat(msg,"a");
strcat(msg,buf);
strcat(msg,"z");
ret=func(s,msg,strlen(msg), flags);
return ret;
}
//受信側
recvex (SOCKET s, char FAR * buf, int len,int flags )
{
int ret,ret2=0,i;
char *size,tmp1[4000],*tmp2,test[1000];
int n=0;
memset(test,'\0',1000);
ret= func(s,tmp1,len, flags);
if(ret<1) return 0;
int limit =ret;
int mark=limit;
int pos=0;
while(pos<limit){
//aをさがす
if(tmp1[pos]=='a'){
mark=pos;
}
//zを探す
if(tmp1[pos]=='z'){
int pos03=pos;
pos=mark;
if(pos03>pos){
//データ部の切り出し
n=pos03-pos-1;//-14;
tmp2=new char[n];
memcpy(tmp2,&tmp1[mark+1],n);
//XORで復号化
for(i = 0; i < n; i++) tmp2 = ~tmp2;
memset(buf,'\0',sizeof(buf));
memcpy(buf,&tmp2[0],n);
strcpy(&buf[n],"\0");
}else{
return n;
}
pos=pos03;
}
pos++;
}
//確認用メッセージボックス
strcat(test,"-");
strcat(test,buf);
strcat(test,"-");
MessageBox(NULL,test,"bufの中",NULL);
return n;
}
そのままでは良くないと思い一応,送るバイナリデータは
簡易的に暗号にしたいともいます。
復号化のためデータの区切りをはっきりさせないといけないので
データの最初に"a"最後に"z"を付けておくります。
例)
dataという文字(テキストですが、バイナリだと思ってください)を送る場合
a(dataをXORで暗号にしたもの)z
というデータを送り、受信側で解析してdataというデータを受け取りたいのです。
以下のコードではテキストデータの送信は成功したのですが、
バイナリデータになると、おかしなデータが送られているようでした。
何か解決方法はありますか?
それとも根本からおかしいのでしょうか?
//送信側
sendex(SOCKET s,char FAR * buf, int len,int flags )
{
int i,ret,n=0;
char msg[4000];
memset(msg,'\0',4000);
//XORを用いて簡易的に暗号にする
for(i = 0; i < strlen(buf); i++) buf = ~buf;
//データの始まりに"a"、終に"z"を書き込み、区切りとして使う
strcat(msg,"a");
strcat(msg,buf);
strcat(msg,"z");
ret=func(s,msg,strlen(msg), flags);
return ret;
}
//受信側
recvex (SOCKET s, char FAR * buf, int len,int flags )
{
int ret,ret2=0,i;
char *size,tmp1[4000],*tmp2,test[1000];
int n=0;
memset(test,'\0',1000);
ret= func(s,tmp1,len, flags);
if(ret<1) return 0;
int limit =ret;
int mark=limit;
int pos=0;
while(pos<limit){
//aをさがす
if(tmp1[pos]=='a'){
mark=pos;
}
//zを探す
if(tmp1[pos]=='z'){
int pos03=pos;
pos=mark;
if(pos03>pos){
//データ部の切り出し
n=pos03-pos-1;//-14;
tmp2=new char[n];
memcpy(tmp2,&tmp1[mark+1],n);
//XORで復号化
for(i = 0; i < n; i++) tmp2 = ~tmp2;
memset(buf,'\0',sizeof(buf));
memcpy(buf,&tmp2[0],n);
strcpy(&buf[n],"\0");
}else{
return n;
}
pos=pos03;
}
pos++;
}
//確認用メッセージボックス
strcat(test,"-");
strcat(test,buf);
strcat(test,"-");
MessageBox(NULL,test,"bufの中",NULL);
return n;
}