c - sendto 中的参数无效

标签 c sockets struct

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

客户端:先发送消息,然后监听回复。 服务器:监听回复然后发送消息。

我能够完美地从客户端发送消息并在服务器中监听。但是当我尝试从服务器发送消息时出现问题。

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 failed\n");
        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 Server\n");

if (n != strlen(replyMessage->data))
    printf("sent %d\n", 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

关于c - sendto 中的参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533318/

相关文章:

c# - 一些异步套接字代码 - 帮助垃圾收集?

go - 方法在结构副本上的应用反射(reflect)在原始结构中

struct - 返回 Julia 中字段已更改的新结构

c - 在 C 中解压缩 .gz 字符串?

C 指针示例 - 这有什么不好的?

c - 为什么第三个 printf 会打印未定义的值?

PHP 能够处理多个 TCP 连接吗?

c - 如何在 C 中对一组函数声明强制执行函数签名?

java - 如何在 Wildfly 8.2 Final 中将 lib 添加到模块中?

oop - 如何强制将struct中的所有字段像OOP中的构造器一样填充?