Chinaunix

标题: 警告:传递参数 时在不兼容的指针类型间转换怎么解决? [打印本页]

作者: pc521    时间: 2010-01-15 20:45
标题: 警告:传递参数 时在不兼容的指针类型间转换怎么解决?
#include<stdio.h>
我用GCC编译以下代码
[code]
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>

#define REMOTEPORT 4567
#define REMOTEIP "127.0.0.1"

int main(int argc,char *argv[])
{
        int s,len;
        struct sockaddr_in addr;
        int addr_len;
        char msg[256];
        int i=0;

        if((s=socket(AF_INET,SOCK_DGRAM,0))<0)
                {
                        perror("error");
                        exit(1);
                }
        else
                {
                        printf("socket created.\n");
                        printf("socked id:%d\n",s);
                        printf("remote ip: %s\n",REMOTEIP);
                        printf("remote port:%d\n",REMOTEPORT);
                }

        len=sizeof(struct sockaddr_in);
        bzero(&addr,sizeof(addr));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(REMOTEPORT);
        addr.sin_addr.s_addr=inet_addr(REMOTEIP);

        while(1)
        {
                bzero(msg,sizeof(msg));       
                len=read(STDIN_FILENO,msg,sizeof(msg));
                sendto(s,msg,len,0,&addr,addr_len);
                printf("\nInput message: %s\n",msg);
                len=recvfrom(s,msg,sizeof(msg),0,&addr,&addr_len);
               
                printf("%d :",i);
                i++;
                printf("Received message: %s \n",msg);
        }
}[/code]
出现警告:
[root@localhost ~]# gcc -o 04 04.c
04.c: In function ‘main’:
04.c:46: 警告:传递参数 5 (属于 ‘sendto’)时在不兼容的指针类型间转换
04.c:48: 警告:传递参数 5 (属于 ‘recvfrom’)时在不兼容的指针类型间转换
请高手帮忙解决,谢谢!
作者: snipex    时间: 2010-01-15 23:49
struct sockaddr {
    unsigned short sa_family; /* address族, AF_xxx */
    char sa_data[14];  /* 14 bytes 的协议地址 */
};
这个结构用来存储套接字地址,那个14字节的sa_data把2字节的端口号和4字节的IP搞在了一起。

为了方便操作,一般用这个结构来代替上面的结构
struct sockaddr_in {
     short int sin_family;        /* Internet地址族 */
     unsigned short int sin_port; /* 端口号 */
     struct in_addr sin_addr;     /* Internet地址 */
     unsigned char sin_zero[8]; /* 添0(和struct sockaddr一样大小)*/
};
这两个结构大小一样,只是第二个结构把端口号和IP地址分离开了,方便操作。

虽然sendto需要一个struct sockaddr*,但是你也可以传一个struct sockaddr_in*给它也没有问题,只是编译器会抱怨类型不匹配,你强制将类型转换为struct sockaddr_in*就没warning了
作者: pc521    时间: 2010-01-16 09:53
原帖由 snipex 于 2010-1-15 23:49 发表
struct sockaddr {
    unsigned short sa_family; /* address族, AF_xxx */
    char sa_data[14];  /* 14 bytes 的协议地址 */
};
这个结构用来存储套接字地址,那个14字节的sa_data把2字节的端口号和4字 ...

怎么强制转换啊,请高手详细告知,谢谢!
作者: ubuntuer    时间: 2010-01-16 13:17

  1. sendto(s,msg,len,0,(const struct sockaddr*)&addr,addr_len);

复制代码

作者: rlingxing    时间: 2010-01-26 14:56
标题: 回复 #1 pc521 的帖子
sendto(s, msg, len, 0, (struct sockaddr *)&addr, addr_len);

recvfrom(s, msg, sizeof(msg), 0, (struct sockaddr *)&addr, &addr_len);




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2