Ich versuche, Integer-Wert in/aus C-Buchse zu schreiben und zu lesen. Manchmal gibt ntohs() sehr große Werte wie 55000, 32000 usw. zurück. Obwohl Client immer Wert < 1500 sendet. Wenn ich das Programm laufe, passiert es nach 10-15 Minuten ... Manchmal nach 20-30 Minuten.ntohs() Problem: Schreibe Integer in C-Socket
Können Sie bitte unten Code überprüfen und mir sagen Warum diese Zeile gedruckt wird?
printf ("Müllwert - ntohs Problem .. Beenden ...");
// 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;
}
}
Danke
Sie sicher, dass es nicht das Drucken wenn/wenn 'len == 0'? Auch 'len' ist ein' uint16_t', es sollte nicht kleiner als 0 sein. Sicherlich gibt es dort Compilerwarnungen. – yano
1) Betrachten Sie die Deklaration/Definition von 'read_n()'.2) Ich würde 'nread = read_n (TCP_SOCKFD, (char *) & plength, sizeof (plength)) erwarten; if (nread
chux
'printf (" Müllwert% X - ntohs Problem .. Beenden ... ", 1u * len)' wäre informativer. – chux