自前の通信プロトコルの実装
Posted: 2010年9月14日(火) 03:43
バイト数,データ
となっている、データがTCPソケットでsend()されます。
例)10,1234567890
7,abcdefg
このデータの部分を途中で切れることなく送った通りに受け取りたいのです。
例)
10,1234567890
が送られてきたら
1234567890
とバッファに入って欲しい
123
で一旦途切れて、
4567890
と来てほしくない
以下のように書いたのですが、実行すると10バイト送った場合、
後ろにゴミと思われるデータがくっついてバッファに書き込まれました。
何か解決方法はありますか?
それとも根本的におかしいのでしょうか?
====================ここから=============================================
int recvex (SOCKET sock, char * buf, int len,int flags )
{
int ret,ret2=0,i;
BOOL Flag=TRUE; // データ長を示す部分が有るか無いか
char *size,tmp1[1024],*tmp2;
size = (char *)malloc(sizeof(char));
tmp2 = (char *)malloc(sizeof(char));
memset(buf,'\0',sizeof(buf));
memset(tmp2,'\0',sizeof(tmp2));
memset(tmp1,'\0',sizeof(tmp1));
//データ長と同じサイズになるまでrecvする
while(ret2==atoi(size)){
if(Flag){
//ここはデータ長の部分が含まれている時の処理
ret= recv(s,tmp1,100, flags);
CmdTok(tmp1,",",2,&tmp2);
strcat(buf,tmp2);
ret2=strlen(tmp1)+ret2;
//データ長の取得
DataTok(tmp1,",",1,&size);
Flag=FALSE;
}else{
//ここはデータ長移行の部分の処理
memset(tmp2,'\0',sizeof(tmp2));
ret= recv(s,tmp2,100, flags);
strcat(buf,tmp2);
ret2=ret+ret2;
}
}
return ret2;
}
//bufから、第三引数が1なら","以前の部分を、2なら","移行の部分を取り出す
int DataTok(char *buf ,char *div,int n ,char **ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
====================ここまで=================================================
となっている、データがTCPソケットでsend()されます。
例)10,1234567890
7,abcdefg
このデータの部分を途中で切れることなく送った通りに受け取りたいのです。
例)
10,1234567890
が送られてきたら
1234567890
とバッファに入って欲しい
123
で一旦途切れて、
4567890
と来てほしくない
以下のように書いたのですが、実行すると10バイト送った場合、
後ろにゴミと思われるデータがくっついてバッファに書き込まれました。
何か解決方法はありますか?
それとも根本的におかしいのでしょうか?
====================ここから=============================================
int recvex (SOCKET sock, char * buf, int len,int flags )
{
int ret,ret2=0,i;
BOOL Flag=TRUE; // データ長を示す部分が有るか無いか
char *size,tmp1[1024],*tmp2;
size = (char *)malloc(sizeof(char));
tmp2 = (char *)malloc(sizeof(char));
memset(buf,'\0',sizeof(buf));
memset(tmp2,'\0',sizeof(tmp2));
memset(tmp1,'\0',sizeof(tmp1));
//データ長と同じサイズになるまでrecvする
while(ret2==atoi(size)){
if(Flag){
//ここはデータ長の部分が含まれている時の処理
ret= recv(s,tmp1,100, flags);
CmdTok(tmp1,",",2,&tmp2);
strcat(buf,tmp2);
ret2=strlen(tmp1)+ret2;
//データ長の取得
DataTok(tmp1,",",1,&size);
Flag=FALSE;
}else{
//ここはデータ長移行の部分の処理
memset(tmp2,'\0',sizeof(tmp2));
ret= recv(s,tmp2,100, flags);
strcat(buf,tmp2);
ret2=ret+ret2;
}
}
return ret2;
}
//bufから、第三引数が1なら","以前の部分を、2なら","移行の部分を取り出す
int DataTok(char *buf ,char *div,int n ,char **ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
====================ここまで=================================================