![](/img/trans.png)
[英]UDP server/client in C - sendto error: Address family not supported by protocol
[英]UDP C Server sendto() error: Can't assign requested address
我正在使用UDP使用C编写基本的客户端/服务器程序。 该程序的思想是,客户端将消息发送到服务器,服务器接收该消息,然后将其回显给客户端(目标是测量UDP的RTT)。 不幸的是,在服务器端,当程序尝试调用sendto()以回显消息时,我收到错误消息“无法分配请求的地址”。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
#define SERVER_PORT 7000
#define MAX_PENDING 10
#define MAX_LINE 1024000
int main()
{
struct sockaddr_in sin, sout;
socklen_t soutLen;
char buf[MAX_LINE];
int len;
int msgLen;
int s;
char *msg;
if( (s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
perror("could not establish UDP socket");
exit(1);
}
/* build address data structure */
bzero((char *)& sin, sizeof( sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);
if( (bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0){
perror("udpServer: bind");
exit( 1);
}
while(1){
if((msgLen = recvfrom(s, buf, sizeof(buf), 0,(struct sockaddr *)&sout, &soutLen))<0){
perror("udpServer: recvfrom()");
exit( 1);
}
if( (sendto(s, buf, msgLen, 0, (struct sockaddr *)&sout, sizeof(sout)))<0 ){
perror("udpServer: sendto()");
exit( 1);
}
free(msg);
}
}
在此先感谢您:我是C语言的新手,因此非常感谢您提供任何建议!
问题是,你sout
传递给sendto
是不正确的,因为你没有正确设置它的大小将它传递给当recvfrom
:
ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len);
如果address不是空指针,并且套接字不是面向连接的,则填充消息的源地址。address_len参数是一个value-result参数,初始化为与address关联的缓冲区的大小,并在返回以指示存储在其中的地址的实际大小。
当将&sout
传递给recvfrom
,还必须告诉recvfrom
您要传入的结构的大小,以便它知道可以在其中写入多少数据soutLen
既是in参数又是out参数。 由于您没有初始化soutLen
,它的值可能小于结构的实际大小,这意味着您在sout
中得到的结果无效。
因此,您需要初始化soutLen
:
struct sockaddr_in sin, sout;
socklen_t soutLen = sizeof(sout);
那么你应该通过这个值的大小来sendto
而不是sizeouf(sout)
(这可能并不需要,但它是很好的做法):
if( (sendto(s, buf, msgLen, 0, (struct sockaddr *)&sout, soutLen))<0 ){
同样,请注意,您正在释放从未分配的msg
。 这无关紧要,但稍后可能会引起问题。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.