[英]UDP - Error in sendto(): Address family not supported by protocol
The following code is a programming sample for using UDP sockets. 以下代码是使用UDP套接字的编程示例。
There are 3 .c
source files ( Client_UDP.c
, Server_UDP.c
, and Message_UDP.c
), and 1 .h
header file ( Prototype.h
). 有3个
.c
源文件( Client_UDP.c
, Server_UDP.c
和Message_UDP.c
)和1个.h
头文件( Prototype.h
)。
I want the Server and Client to communicate with each other only through the functions in Message_UDP
. 我希望服务器和客户端仅通过
Message_UDP
的函数相互通信。
The course of events seems to be like this: 事件的过程似乎是这样的:
"Error in sendto(): Address family not supported by protocol"
. "Error in sendto(): Address family not supported by protocol"
中的错误: "Error in sendto(): Address family not supported by protocol"
。 Does anyone know why? 有人知道为什么吗? How can I solve this?
我该如何解决?
Client_UDP.c Client_UDP.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Prototype.h"
int main(int argc, char * argv[]) {
int fd_socket;
struct sockaddr_in server;
socklen_t length_server = sizeof (server);
fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
Error_A(fd_socket, "Error in socket()");
server.sin_port = htons(8888);
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
// send packet to server
function_SEND(fd_socket, server, length_server, "CLIENT");
// receive packet from server
function_RECEIVE(fd_socket, server, length_server, "CLIENT");
close(fd_socket);
return EXIT_SUCCESS;
}
Server_UDP.c Server_UDP.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Prototype.h"
int main(int argc, char * argv[]) {
int fd_socket;
int rv; // return value
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t length_server = sizeof (server);
socklen_t length_client = sizeof (client);
fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
Error_A(fd_socket, "Errore in socket()");
server.sin_port = htons(8888);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
rv = bind(fd_socket, (struct sockaddr *) &server, length_server);
Error_A(rv, "Error in bind()");
// receive packet from client
function_RECEIVE(fd_socket, client, length_client, "SERVER");
// send packet to client
function_SEND(fd_socket, client, length_client, "SERVER");
close(fd_socket);
return EXIT_SUCCESS;
}
Message_UDP.c Message_UDP.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Prototype.h"
void Error_A(int return_value, char *error_message) {
if (return_value < 0) {
perror(error_message);
exit(EXIT_FAILURE);
}
}
void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender) {
int rv; // return value
char packet[100] = "PACKET";
// send packet
rv = sendto(fd_socket, packet, 100, 0, (struct sockaddr *) &host, length_host);
Error_A(rv, "Error in sendto()");
printf("<%s> -- package sent: <%s> \n", sender, packet);
}
void function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver) {
int rv; // return value
char packet[100] = "";
// receive packet
rv = recvfrom(fd_socket, packet, 100, 0, (struct sockaddr *) &host, &length_host);
Error_A(rv, "Errore in recvfrom()");
printf("<%s> -- packet received: <%s> \n", receiver, packet);
}
Prototype.h 原型
void Error_A(int return_value, char *error_message);
void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender);
void function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver);
This is the client output: 这是客户端输出:
CLIENT -- package sent: PACKET
客户-已发送包裹:PACKET
This is the server output: 这是服务器输出:
SERVER -- package received: PACKET
服务器-收到的包裹:PACKET
Error in sendto(): Address family not supported by protocol
sendto()中的错误:协议不支持地址族
I may be missing something obvious. 我可能缺少明显的东西。 Here is something I noted.
这是我注意到的。 In your Server_UDP.c, there is no initializion for the client .
在Server_UDP.c中, client没有初始化。 I see the declaration struct sockaddr_in client;
我看到了struct sockaddr_in客户端声明; , but there is no assignment.
,但没有分配。 Here, I would assume the client would be assigned the same port number and the loop back IP address, like the following
在这里,我假设为客户端分配了相同的端口号和环回IP地址,如下所示
client.sin_port = 8888;
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("127.0.0.1");
This could be why the send is failing in the server 这可能就是为什么服务器中发送失败的原因
I add this structure in the Prototype.h : 我将此结构添加到Prototype.h中 :
struct Host {
struct sockaddr_in host;
socklen_t length_host;
} host_return;
void Error_A(int return_value, char *error_message);
void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender);
struct Host function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver);
Changing the function_RECEIVE() in Message_UDP.c with this: 以此更改Message_UDP.c中的function_RECEIVE() :
struct Host function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver) {
int rv; // return value
char packet[100] = "";
// receive packet
rv = recvfrom(fd_socket, packet, 100, 0, (struct sockaddr *) &host, &length_host);
Error_A(rv, "Errore in recvfrom()");
printf("%s -- packet received: %s \n", receiver, packet);
host_return.host = host;
host_return.length_host = length_host;
return host_return;
}
and the code in Server_UDP.c put this: 而Server_UDP.c中的代码则如下:
// receive packet from client
host_return = function_RECEIVE(fd_socket, client, length_client, "SERVER");
// send packet to client
function_SEND(fd_socket, host_return.host, host_return.length_host,"SERVER");
instead of 代替
// receive packet from client
function_RECEIVE(fd_socket, client, length_client, "SERVER");
// send packet to client
function_SEND(fd_socket, client, length_client, "SERVER");
it seems to work because the output is (but i hope i don't have had just luck): 它似乎有效,因为输出是(但我希望我没有运气):
CLIENT -- packet sent: PACKET
客户-发送的数据包:PACKET
CLIENT -- packet received: PACKET
客户-收到的数据包:PACKET
server: 服务器:
SERVER -- packet received: PACKET
服务器-收到的数据包:PACKET
SERVER -- packet sent: PACKET
服务器-发送的数据包:PACKET
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.