免费注册 查看新帖 |

Chinaunix

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

不好意思,在这儿问个网络问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-24 21:28 |只看该作者 |倒序浏览
win32 SDK编程问题:
用socket函数建立一个UDP连接时,各写了一个发送端(sendto())和接受端(recvfrom()),有一点老是搞不明白,如果先打开接受端再发送,程序没问题。但是反过来,先打开发送端(while(true)不断发送),再接受数据时,recvfrom就会返回错误(SOCKET_ERROR错误)!

搞不懂怎么解决!!

论坛徽章:
0
2 [报告]
发表于 2007-09-24 21:47 |只看该作者
printf("%d\n",GetLastError());之后把错误号查一下错误结果

论坛徽章:
0
3 [报告]
发表于 2007-09-24 22:09 |只看该作者
因为接收端还未打开, 所以你发送的数据会被对方主机拒绝("ICMP Port Unreachable "). 这个错误在你调用 send/recv 的时候返回给用户进程. 你这种情况可以简单忽略, 或者在用户进程中判断 socket 是否可用.

论坛徽章:
0
4 [报告]
发表于 2007-09-24 23:18 |只看该作者
哥们没理解,我意思:先打开发送端,后打开接受端,也能正确运行。怎么搞?

论坛徽章:
0
5 [报告]
发表于 2007-09-25 07:44 |只看该作者
udp不需要建立连接的吧?

论坛徽章:
0
6 [报告]
发表于 2007-09-25 14:56 |只看该作者
你的意思是如果接收端没打开,那么发送端就等待是么?要不发送端发给谁啊?

论坛徽章:
0
7 [报告]
发表于 2007-09-25 15:30 |只看该作者
愣是没看懂。

论坛徽章:
0
8 [报告]
发表于 2007-09-25 22:12 |只看该作者
意思是:recvfrom在没有收到数据时,应该是阻塞的,不返回(除非超时)。
但是我这个程序不知道怎么搞的,如果先运行sendto(),再运行recvfrom,recvfrom就会报错。难道就不允许先不停地发送sendto??
难到是我得程序出错了?

论坛徽章:
0
9 [报告]
发表于 2007-09-25 22:42 |只看该作者
还是贴代码吧!
接受端:
        SOCKET sockSer = socket(AF_INET,SOCK_DGRAM,0);

        SOCKADDR_IN sa;
        int len = sizeof(SOCKADDR);
        char recvbuf[10];
        sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        sa.sin_family = AF_INET;
        sa.sin_port          = htons(4545);
       
        bind(sockSer,(SOCKADDR*)&sa,len);

        SOCKADDR_IN addRecv;
        int i=0;
        int rval;

        while(1)
        {
                rval = recvfrom(sockSer,recvbuf,10,0,(SOCKADDR*)&addRecv,&len);
                if(rval==SOCKET_ERROR)
                {
                        cout<<"SOCKET_ERROR!"<<endl;
                }
                cout<<recvbuf<<endl;
        }

        closesocket(sockSer);


发送端:
        SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);

        SOCKADDR_IN sa;
        int len = sizeof(SOCKADDR);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        sa.sin_family = AF_INET;
        sa.sin_port          = htons(4545);
       
        bind(sock,(SOCKADDR*)&sa,len);

        char sendbuf[] = "Hello";

        while(true)
        {
                sendto(sock,sendbuf,6,0,(SOCKADDR*)&sa,len);
        }

先打开接受端,再打开发送端,recvfrom返回SOCKET_ERROR,顺序反过来先开接受端就没问题,问一下怎么回事?

论坛徽章:
0
10 [报告]
发表于 2007-09-25 22:51 |只看该作者
原帖由 vincol 于 2007-9-25 22:42 发表
还是贴代码吧!
接受端:
        SOCKET sockSer = socket(AF_INET,SOCK_DGRAM,0);

        SOCKADDR_IN sa;
        int len = sizeof(SOCKADDR);
        char recvbuf[10];
        sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        sa ...

没弄过windows,不过你看看bind,如果这两段代码在一台机器上跑的话,检查一下bind的返回值,我估计有
一个是返回错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP