Я пишу программу, которая обменивается сообщениями между разными битовыми машинами. Мои функции отправки, получения и чтения выглядят так, как показано ниже. Проблема в том, что у меня есть формат пакета, в котором я отправляю сообщения. Тип пакета определяет тип сообщения, например, «Добро пожаловать», «Данные», «Имя пользователя» и т. д. Я читаю тип пакета с SD, а затем читаю оставшиеся данные. Когда я отправляю из 32-битного, тип пакета будет от x до x+4, а данные будут от x+4 до так далее. При приеме на 64-битной машине тип пакета читается от x до x+8 и x+8 в качестве данных, поэтому моя функция чтения ждет вечно, чтобы получить оставшиеся байты длины, как указано. Как исправить эту проблему в этом коде?
/*----------------------------------------------------------------*/
/* messsges received/sent by server */
#define WELCOME_MSG 0
#define USER_NAME 1
#define EMAIL_MSG_TO_SERVER 2
#define EMAIL_MSG_TO_CLIENT 3
#define CLOSE_CON 4
/* structure of a packet */
typedef struct _packet {
/* packet type */
char type;
/* packet length */
long lent;
/* packet text */
char * text;
} Packet;
int readn(int sd, char *buf, size_t n) {
printf("readn via utils. %d, %s, %d\n", sd, buf, n);
size_t toberead = n;
char * ptr = buf;
while (toberead > 0) {
int errno_save = 0;
fprintf(stderr, "toberead: %zu\n", toberead);
ssize_t byteread = read(sd, ptr, toberead);
errno_save = errno;
fprintf(stderr, "toberead: %zu, byteread: %zd\n", toberead, byteread);
if (byteread <= 0) {
fprintf(stderr, "byteread val: %d",byteread);
if (byteread == -1)
{
perror("read");
errno = errno_save;
}
return (0);
}
toberead -= byteread;
ptr += byteread;
}
if ('\0' != buf[n]) /* This assumes buf is one byte **larger** then n. */
{
buf[n] = '\0';
}
fprintf(stderr, "Finished readn. %s\n", buf);
return (1);
}
/*----------------------------------------------------------------*/
Packet *recvpkt(int sd)
{
printf("Recvpkt via utils.\n");
Packet *pkt;
/* allocate space for the pkt */
pkt = (Packet *) calloc(1, sizeof(Packet));
if (!pkt) {
fprintf(stderr, "error : unable to calloc\n");
return(NULL);
}
/* read the message type */
if (!readn(sd, (char *) &pkt->type, sizeof(pkt->type))) {
free(pkt);
return(NULL);
}
/* read the message length */
if (!readn(sd, (char *) &pkt->lent, sizeof(pkt->lent))) {
free(pkt);
return(NULL);
}
pkt->lent = ntohl(pkt->lent);
/* allocate space for message text */
if (pkt->lent > 0) {
pkt->text = (char *) malloc(pkt->lent);
if (!pkt) {
fprintf(stderr, "error : unable to malloc\n");
return(NULL);
}
/* read the message text */
if (!readn(sd, pkt->text, pkt->lent)) {
freepkt(pkt);
return(NULL);
}
}
fprintf(stderr, "Reading packet complete succesfully.\n");
/* done reading */
return(pkt);
}
int sendpkt(int sd, char typ, long len, char *buf)
{
fprintf(stderr, "Send packet via utils. sd: %d, typ: %c, len: %lu, buf: %s\n", sd, typ, len, buf);
char tmp[8];
long siz;
/* write type and lent */
bcopy(&typ, tmp, sizeof(typ));
siz = htonl(len);
bcopy((char *) &siz, tmp+sizeof(typ), sizeof(len));
write(sd, tmp, sizeof(typ) + sizeof(len));
/* write message text */
if (len > 0)
write(sd, buf, len);
return(1);
}
void freepkt(Packet *pkt)
{
fprintf(stderr, "Freeing packet.\n");
free(pkt->text);
free(pkt);
}