我正在尝试在C中实现一个小型UDP服务器/客户端应用程序,并在服务器端遇到两个错误: recvfrom:Bad address && sendto:协议不支持的地址系列。我搜索了这个错误并搜索了答案,但不幸的是,他们并没有真正帮助...也许我正在以错误的方式投射参数并且没有得到它。我希望你能给我一个提示:)。
#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#define BUFFSIZE 256
#define IP "127.0.0.1"
#define PORT 7755
int main(void){
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
char buffer[1] = "s";
struct sockaddr_in src_addr;
struct sockaddr_in dest_addr;
src_addr.sin_family = AF_INET;
src_addr.sin_port = htons(PORT);
src_addr.sin_addr.s_addr = inet_addr(IP);
if(socket_fd==-1)
perror("socket");
if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1)
perror("bind");
if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, (unsigned int *)sizeof(struct sockaddr_in))==-1)
perror("recvfrom");
if(sendto(socket_fd, buffer, 2, 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1)
perror("sendto");
if(close(socket_fd)==-1)
perror("close");
return 0;
}
答案 0 :(得分:9)
您需要将有效指针传递给recvfrom。 (unsigned int *)sizeof(struct sockaddr_in)
不是有效的指针。
更改
if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr,
(unsigned int *)sizeof(struct sockaddr_in) == -1)
例如
socklen_t len = sizeof dest_addr;
if(recvfrom(socket_fd, buffer, 2, 0,
(struct sockaddr*)&dest_addr, &len) == -1)
您还构建了一个发送的无效数组,您的数组的长度为1,但是您告诉sendto / recvfrom它的长度为2.所以更改
char buffer[1] = "s";
到
char buffer[] = "s";
(字符串“s”是字符's'和0字节,因此buffer
在后一种情况下的长度为2。)
答案 1 :(得分:-1)
从主页上的Fedora 18 Beta recv/recvmsg/recv
引用:
ssize_t recv(int sockfd, void *buf, size_t len, int flgags);
ssize_t recvfrom(int sockfd, void*buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t* addrlen);
recvfrom
应该从以下位置进行调整:
recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr,
(unsigned int *)sizeof(struct sockaddr_in) == -1)
要:
recvfrom (socket_fd, buffer, sizeof(buffer), 0,
(struct sockaddr*)&dest_addr, &addrlen);
dest_addr
(eg _buffer_)
始终是指针类型