简单的UDP服务器回复不起作用

时间:2015-03-23 04:16:04

标签: c sockets udp server

现在我只想尝试使用我的服务器"收到UDP数据报后立即回复(为更复杂的东西做准备)。

但是,我一直在sendTo上遇到无效参数错误(在运行时)。任何人都可以帮助指出为什么?我已经编写了其他sendTo&s并查看了Internet上的示例代码,但无法确定原因。

recvfrom工作正常。

谢谢!

void *receive(void *socket)
{
    int* socket_ptr = (int *) socket;
    int socket_desc = *socket_ptr;

    int recv_length;

    socklen_t addrlen = sizeof (struct sockaddr_in);
    while(1){

             struct Message msg;
             struct sockaddr_in * incoming = malloc (sizeof (struct sockaddr_in));

             if ((recv_length = recvfrom (socket_desc, &msg, sizeof(msg), 0,
                 (struct sockaddr *) incoming, &addrlen))
                  == -1)
             {
             }else
             {

                  struct CoordMessage * cm = malloc(sizeof (struct CoordMessage));
                  cm->msgID = BEGINSUCCESS;
                  cm->tid = msg.tid;

                   if (sendto(socket_desc, cm, sizeof(struct CoordMessage), 0, (struct sockaddr *) incoming, sizeof(incoming)) < 0){
                           perror("TEMP Send failed ");
                           exit(1);
                   }
             }
   }
}  

1 个答案:

答案 0 :(得分:0)

sizeof(incoming)调用中的

sendto只是指针的大小,您需要传递从recvfrom调用获得的结构的大小。此外,malloc导致内存泄漏,因为您永远不会free内存。

我建议将结构声明为

struct sockaddr_in incoming = {0};

然后将结构的地址传递给recvfromsendto,例如

if ((recv_length = recvfrom (socket_desc, &msg, sizeof(msg), 0,
    (struct sockaddr *) &incoming, &addrlen))
     == -1)

if (sendto(socket_desc, cm, sizeof(struct CoordMessage), 0, (struct sockaddr *) &incoming, addrlen) < 0)

同样的事情适用于cm变量,如果你malloc它,则需要free它。但你可以宣布它,然后传递地址。