can';地址[47]上的t绑定:协议族不支持地址族
我正在使用一个用C编写的服务器软件。我创建了一个函数,用于设置一个名为can';地址[47]上的t绑定:协议族不支持地址族,c,sockets,C,Sockets,我正在使用一个用C编写的服务器软件。我创建了一个函数,用于设置一个名为config的全局变量,因此我可以在多个项目中使用此代码。 您可以从标题中获取错误消息 typedef struct ntp_conn { int domain; // addressfamily int sType; // sockettype int protocol; // protocol int socket; // socketpointer struct
config
的全局变量,因此我可以在多个项目中使用此代码。
您可以从标题中获取错误消息
typedef struct ntp_conn {
int domain; // addressfamily
int sType; // sockettype
int protocol; // protocol
int socket; // socketpointer
struct sockaddr_in *addr; // address
} ntp_conn;
及
这一点应该是我的错,但我不明白。
谢谢你的帮助
对不起,代码丢失了 您似乎从未为
config->addr
分配过任何内存。我想这至少是一个问题
是否更容易拥有:
typedef struct ntp_conn {
int domain; // addressfamily
int sType; // sockettype
int protocol; // protocol
int socket; // socketpointer
struct sockaddr_in addr; // address <- NOTE NO '*' HERE
} ntp_conn;
typedef结构ntp\U连接{
int域;//addressfamily
int sType;//sockettype
int协议;//协议
int-socket;//socketpointer
struct sockaddr\u in addr;//address请将您的问题代码简化为一个简单的示例。这里有很多东西对您的问题没有用处,并且缺少一些部分。因此我们确实无法理解您的问题所在。我会通过添加errno check来检查sw\u config()。根据,inet\u pton()“如果src不包含表示指定地址族中有效网络地址的字符串,则返回0。如果af不包含有效地址族,则返回-1,并将errno设置为EAFNOSUPPORT。”。"是的。我没有发布这段代码,因为我认为问题出在另一行。我试图阻止无用的垃圾邮件;)。不管怎样,当我尝试用你的结构构建代码时,xCode不喜欢。而带有发送和接收函数的简单http请求也可以用这个swf\u config
。我建议你将问题简化为一个简单的人显示所有代码的可老化程序。通常,您会发现此过程会使程序突然工作,然后您需要通过简化它来解决您修复的问题。如果没有,请将程序发布到此处。请注意,
中的sockaddr\u仅适用于AF\u INET
,但许多套接字函数都采用sockaddr*
sin\u族成员所在的指针表示实际使用的sockaddr\u…
struct的类型(例如,
AF\u INET6`使用sockaddr\u in6
)。因此ntp\u conn
使用sockaddr\u存储
,而不是直接使用sockaddr\u in
,更有意义。
#define BUFFERSIZE 9084
#define MAXCONN 10
#include "swf_conn.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
ntp_conn *config;
void swf_error( char* msg ) {
printf("\n** %s [%d]: %s", msg, errno, strerror(errno));
}
int swf_connect( ) {
config->socket = socket( config->domain, config->sType, config->protocol);
if( config->socket < 0 ) {
swf_error("SOCKET-ERROR:");
exit(-1);
}
if( connect((int)config->socket, (const struct sockaddr*)config->addr, sizeof(struct sockaddr_in)) < 0 ) {
swf_error("CONNECT-ERROR");
exit(-1);
}
return 0;
}
void swf_close( ) {
close( config->socket );
memset(&config, 0, sizeof(config));
}
int swf_config( int domain, int sType, int protocoll, char *ip, short int port ) {
// Good idea?
unsigned int addr;
if( strcmp(ip, "INADDR_ANY") == 0 )
addr = htonl(INADDR_ANY);
else
addr = inet_addr(ip);
config = (struct ntp_conn*) malloc(sizeof(struct ntp_conn));
config->addr = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));
config->domain = domain;
config->sType = sType;
config->protocol = protocoll;
config->addr->sin_family = AF_INET;
config->addr->sin_port = htons(port);
config->addr->sin_len = sizeof(struct sockaddr_in);
config->addr->sin_addr.s_addr = htonl(INADDR_ANY);
memcpy( (char *)&config->addr->sin_addr, &addr, sizeof(addr));
return 0;
}
int swf_put( const void *data ) {
int recived = 0;
int sended = 0;
ntp_thread_recv *recvObj = malloc(sizeof(ntp_thread_recv));
ntp_thread_recv *sendObj = malloc(sizeof(ntp_thread_recv));
if( data == NULL ) {
swf_error("send-error: parameter == NULL");
exit(-1);
}
memcpy( &sendObj->data, &data, sizeof(data) );
printf("\n** sending");
sended = swf_send( sendObj );
if( sended > 0 )
printf("\n** sended %d bytes!\n**\n%s\n", (int)sended, (char*)sendObj->data);
recived = swf_recv( recvObj );
printf("\n** data recived! [%d]\n%s\n", (int)sizeof(recvObj), (char*) recvObj);
return 0;
}
int swf_send( ntp_thread_recv *sendData ) {
ssize_t sended = 0;
int sendSize = sizeof(sendData->data);
int i=0;
do {
sended = send( config->socket, &sendData->data[i], sendSize-sended, 0);
if( sended < 0) {
swf_error("send-error");
exit(-1);
}
} while( sended < sendSize );
return (int)sended;
}
int swf_recv( ntp_thread_recv *recvObj ) {
ssize_t recived = 0;
int recvLen = sizeof(char);
char buffer = (char) malloc(recvLen);
memset(&recvObj->data, 0, sizeof(recvLen*BUFFERSIZE));
int i = 0;
do {
recived = recv( config->socket, &buffer, recvLen, 0);
if( recived < 0) {
swf_error("recv-error");
exit(-1);
}
recvObj->data[(i++)] = buffer;
printf("%s\n", recvObj->data);
memset(&buffer, 0, sizeof(buffer));
} while ( recived > 0 && i < 20 );
printf("%s", recvObj->data);
return 0;
}
int swf_server( char *handleFile ) {
int client[MAXCONN];
struct sockaddr_in *clientAddr;
unsigned int len;
int i = 0;
for( i=0; i<MAXCONN; i++)
client[i] = 0;
i=0;
if( handleFile == NULL ) {
swf_error("handleFile empty!");
exit(-1);
}
config->socket = socket( config->domain, config->sType, config->protocol);
if( config->socket < 0 ) {
swf_error("SOCKET-ERROR:");
exit(-1);
}
if( bind( config->socket, (const struct sockaddr*)&config->addr, sizeof(config->addr) ) < 0 ) {
swf_error("can't bind on address");
exit(-1);
}
if( listen( config->socket, MAXCONN ) < 0 ) {
swf_error("can't listen on socket");
exit(-1);
}
printf("\n** server waiting for connections...");
for(;;) {
if( ( client[i] = accept( config->socket, (struct sockaddr*)&clientAddr, &len ) ) > 0 ) {
ntp_thread_recv *sendObj = malloc(sizeof(ntp_thread_recv));
ntp_thread_recv *recvObj = malloc(sizeof(ntp_thread_recv));
sendObj->data = "welcome to my server!\n\r";
if( swf_send(sendObj) < 0 ) {
swf_error("sending error");
continue;
}
memset(&sendObj, 0, sizeof(sendObj));
FILE *fp;
char *recvBuff[BUFFERSIZE];
char buff;
int j = 0;
while( client[i] > 0 ) {
if( swf_recv(recvObj) < 0 ) {
swf_error("reciving error");
continue;
}
if( strcmp( recvObj->data, "quit") == 0 ) {
client[i] = 0;
memset(&clientAddr, 0, sizeof(clientAddr));
printf("\n** client closed.");
continue;
}
strcat( recvBuff, handleFile );
strcat( recvBuff, recvObj->data );
if( ( fp = popen( recvBuff, "r" ) ) < 0 ) {
swf_error("can't execute the handle file!");
continue;
}
memset( &recvBuff, 0, sizeof(recvBuff) );
while( ( buff = fgetc(fp) ) )
memcpy(&recvBuff[i++], &buff, sizeof(buff));
if( j > 0 ) {
memcpy(&sendObj->data, &recvBuff, (j+1)*sizeof(char));
} else {
sendObj->data = "nothingtosend\n\r";
swf_error("can't read result from your handle file!");
}
j = 0;
memset(&recvBuff, 0, sizeof(recvBuff));
if( swf_send(sendObj) < 0 ) {
swf_error("sending error");
continue;
}
memset(&sendObj, 0, sizeof(sendObj));
}
} else {
client[i] = 0;
}
}
return 0;
}
#include <stdio.h>
#include <stdio.h>
#include "swf_conn.h"
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, const char * argv[])
{
char *ip = "0.0.0.0";
// char *buff = ( char * ) malloc( 1024 * sizeof( char ) );
printf("\n SERVER\n");
printf("\n%s", ip);
if( swf_config( PF_INET, SOCK_STREAM, IPPROTO_TCP, ip, 81) < 0 )
printf("\n** ERROR: ");
else
printf("\n** socket created...");
if( swf_server("./handleFile") < 0 )
printf("\n** error!");
return 0;
}
SERVER
0.0.0.0
** socket created...
** can't bind on address [47]: Address family not supported by protocol family
typedef struct ntp_conn {
int domain; // addressfamily
int sType; // sockettype
int protocol; // protocol
int socket; // socketpointer
struct sockaddr_in addr; // address <- NOTE NO '*' HERE
} ntp_conn;