Cソケットに整数値を書き込み、読み込みしようとしています。ときどきntohs()は55000、32000などの非常に大きな値を返します。クライアントは常に<という値を送信しますが、プログラムを実行すると10〜15分後に発生します... 20〜30分後に発生することがあります。ntohs()問題:Cソケットに整数を書き込む
コードを確認して教えてください なぜこの行が印刷されますか?
printf( "Garbage value - ntohs problem .Exiting ...");
// write exactly n byte
inline int write_n(int fd, char *buf, int n) {
int nwrite, left = n;
int totalwrite = 0;
while (totalwrite != n) {
if ((nwrite = write(fd, buf, left)) <= 0) {
break;
} else {
totalwrite = totalwrite + nwrite;
left -= nwrite;
buf += nwrite;
}
}
if (totalwrite == 0)
return nwrite;
return totalwrite;
}
// send exactly n byte
inline int send_n(int fd, char *buf, int n) {
int nwrite, left = n;
int totalwrite = 0;
while (totalwrite != n) {
if ((nwrite = send(fd, buf, left, MSG_NOSIGNAL)) <= 0) {
break;
} else {
totalwrite = totalwrite + nwrite;
left -= nwrite;
buf += nwrite;
}
}
if (totalwrite == 0)
return nwrite;
return totalwrite;
}
uint16_t nread, len, plength, nsend;
int MTU = 1500;
char buffer[2000];
// Server receive (Linux 64 bit)
while (1) {
// read packet length
nread = read_n(TCP_SOCKFD, (char *) &plength, sizeof(plength));
if (nread <=0) {
break;
}
len = ntohs(plength);
if (len <=0 || len > 1500) {
**printf("Garbage value - ntohs problem ..Exiting... "); // WHY ?**
break;
}
// read packat data
nread = read_n(SOCKFD, buffer, len);
if (nread != len) {
break;
}
}
//---------------------
// CLIENT send (Android 5)
while (1) {
nread = read(tunfd, buffer, MTU);
if (nread <= 0 || nread > 1500) { // always <=1500
break;
}
plength = htons(nread);
// send packet lenght
nsend = send_n(TCP_SOCKFD, (char *) &plength, sizeof(plength));
if (nsend != sizeof(plength)) {
break;
}
// send packet data
nsend = send_n(TCP_SOCKFD, buffer, nread);
if (nsend != nread) {
break;
}
}
あなたが検証可能な例を提供することができないので、我々は何が起こっているのか確実にあなたを伝えることができないあなたに
もし '/ len == 0'のときに/が表示されないのは間違いないでしょうか?また、 'len'は' uint16_t'です.0より小さくすべきではありません。確かにいくつかのコンパイラの警告があります。 – yano
1) 'read_n()'の宣言/定義の投稿を検討してください。2)私は 'nread = read_n(TCP_SOCKFD、(char *)&plength、sizeof(plength))を期待しています。 if(nread
chux
'printf("ガベージ値%X - ntohsの問題.Exiting ... "、1u * len)'はより有益です。 – chux