C中的UDP客户端

时间:2012-05-22 19:26:50

标签: c sockets udp

我使用http://www.abc.se/~m6695/udp.html

上的代码

代码工作正常,我可以看到消息已发送,服务器收到它。但是,当我构建程序时,我得到以下“从不兼容的指针类型[默认启用]”传递'sendto'的参数5“为行”if (sendto(s, buf, BUFSIZE, 0, &si_other, slen)==-1){“。如果有人能告诉我如何解决,我将不胜感激。谢谢

    #define  MAXSTRINGLENGTH 128
#define BUFSIZE 512

void log_msg_send(char *message, char *next_hop);
    void log_msg_send(char *message, char *next_hop);

int main(int argc, char** argv) {
    char hello[] = "hello bitches";
    char next_hop[]= "192.168.1.178";
    log_msg_send(hello, next_hop);
}

void log_msg_send(char *message, char *next_hop){
    char SRV_IP[16]; 
    strcpy(SRV_IP,  next_hop);

         struct sockaddr_in si_other;
         int s, i, slen=sizeof(si_other);
         char buf[50] ;
         strcpy(buf, message);

        if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1){
          fprintf(stderr, "inet_aton() failed\n");
          exit(1);
        }

        memset((char *) &si_other, 0, sizeof(si_other));
        si_other.sin_family = AF_INET;
        si_other.sin_port = htons(33333);
        if (inet_aton(SRV_IP, &si_other.sin_addr)==0) {
          fprintf(stderr, "inet_aton() failed\n");
          exit(1);
        }
          printf("Sending the packet %d\n", i);
          if (sendto(s, buf, BUFSIZE, 0, &si_other, slen)==-1){
          fprintf(stderr, "inet_aton() failed\n");
          exit(1);
        }

        close(s);

}

4 个答案:

答案 0 :(得分:4)

快速修复:

sendto(s, buf, BUFSIZE, 0, (struct sockaddr *)&si_other, slen)

此转换是必需的,因为sendto()期望指向struct sockaddr的指针作为其第五个参数,而您的特定套接字地址类型为struct sockaddr_in

答案 1 :(得分:3)

来自POSIX文档:

ssize_t sendto(int socket, const void *message, size_t length,
   int flags, const struct sockaddr *dest_addr,
   socklen_t dest_len);

所以sendto()的第五个参数应该是struct sockaddr *。但是,您传递的是(内存布局兼容)struct sockadd_in *。修复:将其强制转换为适当的指针类型:

sendto(s, buf, BUFSIZE, 0, (struct sockaddr *)&si_other, slen)

答案 2 :(得分:3)

请检查一下:

sendto(s, buf, BUFSIZE, 0, (SOCKADDR *)&si_other, slen)

其中:

typedef struct sockaddr SOCKADDR;

答案 3 :(得分:0)

使用:

sendto(s,buf,BUFSIZE,0,(struct sockaddr*) &si_other, (socklen_t) slen)

对我有用!

相关问题