c-sendto中的参数无效



我有两个相互通信的程序。

客户:先发送消息,然后收听回复。服务器:侦听答复,然后发送消息。

我可以完美地从客户端发送消息,也可以在服务器上监听。但当我尝试从服务器发送消息时,问题就来了。

struct hostent *gethostbyname();
typedef struct Message {
    unsigned int length;
    unsigned char data[SIZE];
} Message;
typedef struct sockaddr_in SocketAddress;
int fileDesc;
int aLength;
void main(int argc, char **argv) {
    Message callMsg, rep;
    aLength = 0;
    SocketAddress clientSAMain, serverSAMain;
    int port = RECIPIENT_PORT;
    if ((fileDesc = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket failed");
        //return BAD;
    }
    makeReceiverSA(&serverSAMain, port);
    if (bind(fileDesc, (struct sockaddr *) &serverSAMain,
            sizeof(struct sockaddr_in)) != 0) {
        perror("Bind failedn");
        close(fileDesc);
        //return BAD;
    }
    clientSAMain.sin_family = AF_INET;
    aLength = sizeof(serverSAMain);
    GetRequest(&callMsg, port, &clientSAMain);
    SendReply(&rep, port, clientSAMain);
    close(fileDesc);
}
void GetRequest(Message *callMessage, int s, SocketAddress *clientSA) {
    //SocketAddress serverSA;
    int n;
    int i;
    if ((n = recvfrom(fileDesc, callMessage->data, SIZE, 0,
            (struct sockaddr *) &clientSA, &aLength)) < 0)
        perror("Receive 1");
    else
        printf("n Received Message:(%s)length = %d n", callMessage->data, n);
}
}

void SendReply(Message *replyMessage, int s, SocketAddress clientSANew) {
printf("Enter a reply:");
scanf("%s", replyMessage->data);
if ((n = sendto(fileDesc, replyMessage->data, sizeof(replyMessage->data), 0,
        (struct sockaddr *) &clientSANew, sizeof(struct sockaddr_in))) < 0)
    perror("Send Failed in Servern");
if (n != strlen(replyMessage->data))
    printf("sent %dn", n + 1);
}
/* make a socket address using any of the addressses of this computer
 for a local socket on given port */
void makeReceiverSA(struct sockaddr_in *sa, int port) {
sa->sin_family = AF_INET;
sa->sin_port = htons(port);
sa->sin_addr.s_addr = htonl(INADDR_ANY);
}

//如果我把sendreply函数代码放在GetRequest函数中,它工作得很好。有人能帮我吗。我一直在尝试所有可能的方法,但没有找到解决方案。对我来说,工作正在进行中,所以如果这是一个愚蠢的问题,请饶了我。

PS:删掉了所有不必要的代码。

recvfrom(fileDesc, callMessage->data, SIZE, 0,
         (struct sockaddr *) &clientSA, &aLength)

因为clientSA是指针,所以上面的调用会覆盖指针变量及其后的内存。上面调用中的&clientSA应该是clientSA

最新更新