为什么我得到协议不支持的地址族错误

Why i am getting error of adress family not supported by protocol?

本文关键字:地址 错误 不支持 协议 为什么      更新时间:2023-10-16

我正在使用UDP协议实现双向通信,最初我从客户端发送消息HELO到服务器成功显示在服务器端,但是当我从服务器发送消息到客户端回复HELO时,它给了我错误:地址族不支持协议。

我的服务器代码:

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

using namespace std;
int main(void)
    {
    char write[100];
    int MAXBUFLEN=100;
    char* buf;
    char msg[100];
    char swp;
    int l,x,y;
    int conn_sock,n,err;
    struct sockaddr_in server_addr,client_addr;
    conn_sock=socket(AF_INET,SOCK_DGRAM,0);
    if(conn_sock == -1)
    {
    perror("nnError in making socket and error is");
    cout<<"Error No:tn"<<errno;
    exit(0);
    }
    server_addr.sin_family= AF_INET;
    server_addr.sin_port = 1234;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    err=bind(conn_sock,(struct sockaddr *)&server_addr,sizeof(server_addr)); // binding...
    if(err == -1)
    {
    perror("nnError in binding and error is:");
    cout<<"Error No:tn"<<errno;
    exit(0);
    }
    int s=sizeof(client_addr);
    n=recvfrom(conn_sock,msg,sizeof(msg),0,(struct sockaddr *)&client_addr,(socklen_t*)s); // reciving HELO from client..

    cout<<msg<<endl;
    cout<<"The messgae hasbeen recieved from client now enter a reply for HELO msg:"<<endl;
    cin>> write;
    // sending reply to client
    int m=sendto(conn_sock,write,strlen(write),0,(sockaddr *)&client_addr,s); // sending reply to client on reply of helo...
    if (m== -1){
     perror("talker: sendto");
    }
    // now recieve mail fromm...
    recvfrom(conn_sock,msg,sizeof(msg),0,(struct sockaddr *)&client_addr,(socklen_t*)s);
// sending rcpto client
    sendto(conn_sock,write,strlen(write),0,(sockaddr *)&client_addr,s);
    recvfrom(conn_sock,msg,sizeof(msg),0,(struct sockaddr *)&client_addr,(socklen_t*)s);
    cout<<"Recpt to: Nu.edu.pk"<<endl;  
    exit(0);
}

下面是我的客户端代码:

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#define SERVERPORT "4950"    // the port users will be connecting to
#define MAXBUFLEN 100
using namespace std;
int main(int argc, char*argv[])
{
    // declarations
    char msg3[]="DATA";
    int sockfd;
        struct addrinfo hints, *servinfo, *p;
        int rv;
        int numbytes;
        char buf[MAXBUFLEN];
        socklen_t addr_len;
        struct sockaddr_storage their_addr;
    char* bigarray;
    char msg[]="HELO";
    char msg2[]="Mail from: Mahnoorfatima@gmail.com";   
    int i=0;
    char * adress;
    char * subject;
    char * name;
    const char *delim="@";
    // getting commandline args into arrays.
    adress=argv[i+1];
    char* host=strtok(adress,delim );
    subject=argv[i+2];
    name=argv[i+3];

    // putting all in one array
    bigarray=adress;
    bigarray=subject;
    bigarray=name;


    if(argc>9){
    cout << "Just provide three arguments in commandline,please. " << endl;
        }
    // gets the name of the host:
    int a=gethostname(bigarray, 100);
    cout<<"The host of the client is:"<<a<<endl;

    int conn_sock,n,m,err;
    struct sockaddr_in server_addr;
    conn_sock=socket(AF_INET,SOCK_DGRAM,0);
    if(conn_sock ==-1)
    {
    perror("nnError in making socket and error is");
    cout<<"Error No:tn"<<errno;
    exit(0);
    }

    server_addr.sin_family= AF_INET;
    server_addr.sin_port = 1234;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int pp=sizeof(server_addr);
    n=sendto(conn_sock,msg,strlen(msg),0,(sockaddr *)&server_addr,pp);//sending HELO to server...
    n=recvfrom(conn_sock,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,(socklen_t*)pp);
    cout<<"Mail from: mahnoorfatima22@gmail.com"<<endl;
    n=sendto(conn_sock,msg2,strlen(msg2),0,(sockaddr *)&server_addr,pp);

        // sending file to server
    // reieving from server rcpto command
    recvfrom(conn_sock,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,(socklen_t*)pp);   
    // sending data command to the server....
    n=sendto(conn_sock,msg3,strlen(msg3),0,(sockaddr *)&server_addr,pp);
        //Sending the filename to server...
        if ((n = sendto(sockfd,name,strlen(name), 0,p->ai_addr, p->ai_addrlen)) == -1) {
        //     perror("Error is sending");
                exit(1);
                                                }              
        //     Get the size of the file server sy 
    addr_len = sizeof their_addr;
        if ((n = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) {
        //     perror("Error in recieving file");
         exit(1);
                                                        }

        cout<<"client: recieved file size: %snNumbytes:%dn"<<buf<<numbytes;


    exit(0);
    }

问题很可能是recvfrom函数期望指针指向套接字地址结构的大小,而您提供了按值的长度。这意味着编译器认为你设置的大小(sizeof(client_addr))被解释为一个指针,无论结构大小是什么,它都不是一个有效的指针或指向远程有效的东西。

这意味着recvfrom可能没有完全填充对等地址结构(client_addr),从而导致sendto失败。

试试这样:

n=recvfrom(conn_sock,msg,sizeof(msg),0,
          (struct sockaddr *)&client_addr,&s);
//                                        ^
//                                        |
//            Note address-of operator here