免费注册 查看新帖 |

Chinaunix

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

关于getsockname和accept的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-28 16:30 |只看该作者 |倒序浏览
我在运行程序时,怎么老是出现这样的警告:
pointer targets in passing argument 3 of 'getsockname' differ in signedness.
pointer targets in passing argument 3 of 'accept' differ in signedness.

论坛徽章:
0
2 [报告]
发表于 2007-04-28 17:01 |只看该作者

回复 #1 苦竹 的帖子

应该是你函数的变量写错了, 贴代码看看!

论坛徽章:
0
3 [报告]
发表于 2007-04-28 17:27 |只看该作者
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
int main()
{
        int sock,msgsock,len,length,rval,i,n;
        char buf[1024],data[1024],c;
        struct sockaddr_in serveraddr;
        struct sockaddr_in clintaddr;
        struct hostent*host;
        char host_name[256];
        n=gethostname(host_name,256);
        host=gethostbyname(host_name);
        if(host!=NULL)
        {
        for(i=0;host->h_addr_list!=NULL;i++)
        {
        memset(&serveraddr,0,sizeof(serveraddr));
        memcpy(&serveraddr.sin_addr.s_addr,host->h_addr_list,host->h_length);
        printf("本机地址:%s\n",inet_ntoa(serveraddr.sin_addr));
        }
        }
        sock=socket(AF_INET,SOCK_STREAM,0);
        if(sock==-1)
        {
        printf("creat socket error.\n");
        exit(1);
        }
        memset(&serveraddr,0,sizeof(struct sockaddr_in));
        serveraddr.sin_family=AF_INET;
        serveraddr.sin_port=INADDR_ANY;
        if(bind(sock,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))==-1)
        {       
                printf("bind error.\n");
                exit(1);
        }
        len=sizeof(struct sockaddr_in);
        if(getsockname(sock,(struct sockaddr*)&serveraddr,&len)<0)
       
        {
        printf("get sockname error.\n");
        exit(1);
        }
        printf("listening port:%d\n",ntohs(serveraddr.sin_port));
        listen(sock,5);       
        while(1)
        {
                length=sizeof(struct sockaddr_in);
                msgsock=accept(sock,(struct sockaddr*)&clintaddr,&length);
                if(msgsock=-1)
                {
                printf("accept msg error.\n");
                exit(1);
                }
                printf("客户端地址:%s\n",inet_ntoa(clintaddr.sin_addr));
                while(1)
                {
                        memset(buf,0,1024);
                        rval=recv(msgsock,buf,1024,0);
                        if(rval<0)
                        {
                        printf("recv error.\n");
                        exit(1);               
                        }
                        if(rval==0)
                        {
                        printf("end connecting.\n");
                        close(msgsock);
                        }
                        else printf("消息:%s\n",buf);
                        printf("发送:");
                        memset(data,0,1024);
                        i=0;
                        c=getchar();
                        while(c!='\n')
                        {
                                data=c;
                                i++;
                        }
                        data='\0';
                        send(msgsock,data,sizeof(data),0);
                }
        close(msgsock);
        }
return 0;
}
这是服务器的程序.

论坛徽章:
0
4 [报告]
发表于 2007-04-28 18:25 |只看该作者

回复 #3 苦竹 的帖子

你把len和length都声明为socklen_t 这种类型试试看.

论坛徽章:
0
5 [报告]
发表于 2007-04-28 18:31 |只看该作者

回复 #4 苦竹 的帖子

我按照你说的改了类型,没有错误了,但是怎么客户端连不上服器
我的客户端的程序为:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char*argv[])
{
        int sock,i,n;
        char c,data[1024];
        struct sockaddr_in serveraddr;
        struct hostent *host;
        if(argc<3)
        {
                printf("Usage:%s\n",argv[0]);
                exit(1);
        }       
        host=gethostbyname(argv[1]);
        if(host==NULL)
        {
                printf("get hostname error.\n");
                exit(1);
        }
        sock=socket(AF_INET,SOCK_STREAM,0);
        if(sock==-1)
        {
                printf("creat sock error.\n");
                exit(1);
        }
        memset(&serveraddr,0,sizeof(serveraddr));
        serveraddr.sin_family=AF_INET;
       
        serveraddr.sin_port=htons(atoi(argv[2]));
        memcpy((char*)&serveraddr.sin_addr,(char*)host->h_addr,host->h_length);
        n=connect(sock,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr));
        if(n==-1)
        {
                printf("conect error.\n");
                exit(1);
        }
        printf("主机地址:%s    端口:%d\n",inet_ntoa(serveraddr.sin_addr),ntohs(serveraddr.sin_port));
        while(1)
        {       
                printf("发送:");
                memset(data,0,1024);
                i=0;
                c=getchar();
                while(c!='\n')
                {
                        data=c;
                        i++;
                }       
                data='\0';
                if(send(sock,data,sizeof(data),0)==-1)
                {
                        printf("send msg error.\n");
                        exit(1);
                }
                if(recv(sock,data,1024,0))
                printf("消息:%s\n",data);
        }
return 0;
}

论坛徽章:
0
6 [报告]
发表于 2007-04-28 19:28 |只看该作者

回复 #5 苦竹 的帖子

memcpy((char*)&serveraddr.sin_addr,(char*)host->h_addr,host->h_length);
这一行代码变成:
serveraddr.sin_addr.s_addr = ((struct in_addr*)(host->h_addr))->s_addr;
试试看. 还有, 是connect()出错吗?

论坛徽章:
0
7 [报告]
发表于 2007-04-29 17:04 |只看该作者

回复 #6 scutan 的帖子

不是connect()出错,是服务器accept()出错,我运行客户端程序与服务器相连时,服务那边显示accept()出错.这两个程序单独运行时都没有错误,就是连接时出错,不知道问题出在哪里.请各位大侠帮我看看.

论坛徽章:
0
8 [报告]
发表于 2007-05-03 14:43 |只看该作者
先用perror把错误打印出来看一下是什么错吧~~

论坛徽章:
0
9 [报告]
发表于 2007-05-07 11:14 |只看该作者

回复 #8 bedreaming 的帖子

我上面好像说的有点问题,我的意思是当客户机与服务器相连时,服务那边显示"accept msg error",也就是在执行accept()函数时,并没有错误发生,只是没有通过.

论坛徽章:
0
10 [报告]
发表于 2007-07-23 13:47 |只看该作者
accept后面的长度参数要初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP