gpt4 book ai didi

c - recvfrom 只读取了 15 个字节

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:42 27 4
gpt4 key购买 nike

我无法使用 recvfrom 读取超过 15 个字节,我已尝试更改 SO_RCVBUF 选项并增加 recvfrom 参数的大小,但仍然只能读取 15 个字节。

int a = 65535;
if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) {
fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
}
...
bytes = recvfrom(sd, buffer, 2048, 0,(struct sockaddr *) &addr, &addr_len);

但是 recvfrom 函数仍然只读取了 15 个字节。

客户端UDP.c

#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdio.h>

int main (int argc, char ** argv){

int sd, addr_len, bytes;
char buffer[2048];
struct sockaddr_in addr;
sd = socket ( PF_INET, SOCK_DGRAM, IPPROTO_UDP);
bzero (&addr, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8787);
inet_aton("127.0.0.1", &addr.sin_addr );
printf("->:");
gets(buffer);
sendto (sd, buffer , 15, 0 ,(struct sockaddr *)&addr, sizeof(addr));
do{
addr_len = sizeof(addr);
setsockopt(sd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int));

bytes = recvfrom(sd, buffer, 2048, MSG_WAITALL,,(struct sockaddr *) &addr, &addr_len);
if(bytes>0){
printf("Mensaje de %s: %d (%d bytes)\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), bytes );

printf("el mensaje dice :");
puts(buffer);
printf("-:");
gets(buffer);
sendto (sd, buffer , 15, 0 ,(struct sockaddr *)&addr, sizeof(addr));

}

}while(1);

return 0;
}

服务器UDP.c

#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>

int main (int argc, char ** argv){

struct sockaddr_in addr;
int sd;
int bytes, reply_len, addr_len;
char buffer[2048];
sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
int a = 65535;

bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8787);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
printf("Error en BIND\n");
}
do {
addr_len = sizeof(addr);

bytes = recvfrom(sd, buffer, 2048, MSG_WAITALL,(struct sockaddr *) &addr, &addr_len);
setsockopt(sd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int));
if(bytes>0){
printf("Mensaje de %s: %d (%d bytes)\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), bytes );
printf("el mensaje dice :");
puts(buffer);
printf("-:");
gets(buffer);
sendto (sd, buffer , 15, 0 ,(struct sockaddr *)&addr, sizeof(addr));

}
}while(1);
}

最佳答案

UDP 是基于消息的,不像 TCP 是基于流的。 recv/from() 无法接收部分 UDP 数据,读取是全有或全无。如果您传入一个 2048 字节的缓冲区并且 recv/from() 报告读取了 15 个字节,那么 UDP 消息负载实际上是 15 个字节。您可以使用数据包嗅探器(例如 Wireshark)来验证这一点。

关于c - recvfrom 只读取了 15 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221003/

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