我无法使用 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/