免费注册 查看新帖 |

Chinaunix

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

一个关于accept 和 inet_ntoa 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-20 18:38 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <sys/socket.h>
#include <netinet/in.h>

void client()
{
        sleep(3);       

        int childsock = socket(AF_INET,SOCK_STREAM,0);
        if (childsock == -1)
        {
                perror("create socket in child");
                exit(1);
        }
        struct sockaddr_in server;
        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(10000);
        server.sin_addr.s_addr = inet_addr("127.0.0.1");

       
        if (connect (childsock,(struct sockaddr*)&server,sizeof(struct sockaddr)) == -1)
        {
                perror("connect in child ");
                exit(1);
        }
        close (childsock);
        exit(0);
}



int main()
{
        int i = 0;
        for (; i < 10 ; i++)
        {
                pid_t child = fork ();
                if (child == -1)
                {
                        perror("fork");
                        exit(1);
                }
                else if (child == 0)
                {
                        client();
                }
        }
       
        int retcd;
        int sock = socket(AF_INET,SOCK_STREAM,0);
        if(sock == -1)
        {
                perror("socket");
                exit(1);
        }
               
        int sopt = 1;
        retcd = setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&sopt, sizeof(int));
        if (retcd == -1)
        {
                perror("setsockopt");
        }
       
        struct sockaddr_in local;
        bzero(&local,sizeof(local));
        local.sin_family = AF_INET;
        local.sin_port = htons(10000);
        local.sin_addr.s_addr = INADDR_ANY;
               
        if ( bind(sock,(struct sockaddr*)&local,sizeof(struct sockaddr)) == -1 )
        {
                perror("bind");
                exit(1);
        }       
       
        if ( listen(sock,10) == -1 )
        {
                perror("listen");
                exit(1);
        }

        while (1)
        {       
                struct sockaddr_in remote;
                socklen_t len;
                int newsock = accept(sock,&remote,&len);

                printf("Request from %s\n",inet_ntoa(remote.sin_addr));                       
        }

        close(sock);
}
desktop:/data/learning/C/net # ./accept_sockaddr
Request from 0.0.0.0
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1
Request from 127.0.0.1


每次运行结果的第一次IP 都不对 不知道为什么
请大家帮我分析分析

[ 本帖最后由 xiaozi16 于 2010-1-20 18:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2010-01-21 08:48 |只看该作者

回复 #1 xiaozi16 的帖子

哥们儿,按套路来就没问题了

                struct sockaddr_in remote;
               //加上这一句
                socklen_t len = sizeof(struct sockaddr_in);                          
                int newsock = accept(sock,(struct sockaddr*)&remote,&len);

论坛徽章:
0
3 [报告]
发表于 2010-01-21 10:48 |只看该作者

回复 #2 rain_fish 的帖子

  谢谢你的答复  解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP