gpt4 book ai didi

c - 通过套接字打包和发送二进制数据时出现问题 - 序列化

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:36 25 4
gpt4 key购买 nike

我已经尝试、调试和哭了几个小时,希望我的程序能够正确地发送/打包和接收/解包我的数据。我唯一的希望是一些好的帮助!

为了打包/解包数据,我实现了Beej 的网络编程指南 example pack2.c

代码工作打包/解包在同一个程序内部工作。但是当我尝试通过套接字将打包数据发送到同一台计算机上的另一个程序时,它不会工作!我的想法是 recv() 和 send() 函数在某种程度上可能会使数据损坏或类似的东西,我尝试通过几种方式进行调试:

我需要一些帮助才能让它正常工作,我认为问题在于发送和接收 buf 的方式,因为 pack()/unpack() 函数在程序内部工作。

谢谢

客户端:

unsigned char buf[1024];

int16_t packetsize = pack(buf, "h", (int16_t)37);
packi16(buf+1, packetsize);
int len = packetsize;

uint16_t header = htons(packetsize); //Convert from host -> network

//Sends info to receiver about next pack coming.

printf("HEADER SIZE %d\n", packetsize);

if(send(sock, &header, packetsize, 0) == -1) {
perror("sendall");
}


/*==========SEND PACKAGE======================*/

int bytessendt = send(sock, buf, len, 0);//server_send_all(sock, buf, &len);

if(bytessendt == -1) {
perror("sendall");
}

printf("BYTES SENT OVER SOCKET: %d \n", bytessendt);


close(sock);

服务器端:

                uint16_t buf;
int len = sizeof(buf);

if(recv(i, &buf, len, 0) == -1) {
printf("****Error when receiving");
}

int header = ntohs(buf);

printf("HEADER SIZE: %d\n", header);

/*========REICIVE PACK AND UNPACK================*/

unsigned char buf2[1024];
int16_t monkeycount;

int bytesreaded = recv(i, buf2, header, 0);

if(bytesreaded == -1) {
printf("Feil ved mottakelse\n");
}

printf("BYTES READED: %d\n", bytesreaded);
printf("BYTES SHOULD BE READED: %d\n", header);

unpack(buf2, "h", &monkeycount);


printf("CONTENT: %d\n", monkeycount);


close(i);

int server_send_all(int socket, unsigned char *buf, int *len) {

int total = 0; //Total amout of data to send
int bytesleft = *len; //Amount of data left to send
int n; //Holds return from send()

printf("SOCKET -DATA TO SEND: %d\n", *len);

while(total < *len) {
n = send(socket, buf+total, bytesleft, 0);

if(n == -1) { //send() returns error
break;
}

total += n;
bytesleft -= n;
}

*len = total; //Returns actually sent

return n == -1?-1:0;
}

发送字符串

来自客户:

int packetsize = 0;
packetsize += pack(buf + packetsize, "h", (int16_t)37);
packetsize += pack(buf + packetsize, "s", "Hello World");

send(sock, &header, packetsize, 0)

到服务器:

     char s2[30];
unpack(buf2, "h30s", &monkeycount, s2);

printf("CONTENT: %d %s\n", monkeycount, s2);

给出输出

内容:37 Hello World

最佳答案

该解包代码需要一个 int * 参数来解包一个 int16_t:将您的声明更改为 int monkeycount;

关于c - 通过套接字打包和发送二进制数据时出现问题 - 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13254428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com