免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11132 | 回复: 4
打印 上一主题 下一主题

警告:传递参数 时在不兼容的指针类型间转换怎么解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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’)时在不兼容的指针类型间转换
请高手帮忙解决,谢谢!

论坛徽章:
0
2 [报告]
发表于 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了

论坛徽章:
0
3 [报告]
发表于 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字 ...

怎么强制转换啊,请高手详细告知,谢谢!

论坛徽章:
0
4 [报告]
发表于 2010-01-16 13:17 |只看该作者

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

复制代码

论坛徽章:
0
5 [报告]
发表于 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);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP