免费注册 查看新帖 |

Chinaunix

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

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

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

搞不懂怎么解决!!

论坛徽章:
0
2 [报告]
发表于 2007-09-24 23:18 |显示全部楼层
哥们没理解,我意思:先打开发送端,后打开接受端,也能正确运行。怎么搞?

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

论坛徽章:
0
4 [报告]
发表于 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
5 [报告]
发表于 2007-09-25 23:05 |显示全部楼层
原帖由 mingyanguo 于 2007-9-25 22:51 发表

没弄过windows,不过你看看bind,如果这两段代码在一台机器上跑的话,检查一下bind的返回值,我估计有
一个是返回错误。


谢了,对的!!后绑定的,返回错误。
怎么解决??????????????????是不是没办法解决。

而且在反顺序后,能很好的运行!即:后绑定 sendto端,有bind错误,但确实能发送到正常端口,看来虽然返回错误,实际的绑定工作却到位了。 而后绑定recvfrom时,就不能正确地接受,为什么?????????

论坛徽章:
0
6 [报告]
发表于 2007-09-25 23:30 |显示全部楼层
原帖由 mingyanguo 于 2007-9-25 23:11 发表

就你的例子而言,我认为发送端不需要bind。

btw,先了解网络协议在做网络编程会容易一些,另外,有必要了解一下bind这些调用的实际作用。


受教!!! 本来就不用bind,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP