5176|12

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急问:为何我使用Winsock接收数据总是不能正常接收 [复制链接]

自己写的服务端和客户端,头文件包含是winsock2.h, 库使用的是Ws2.lib。

客户端发送消息是正常的,服务端也能收到消息,但是接收不到客户端发送的具体消息内容(一个字符串)。

同样的代码在windows下可以正常使用(用的库是ws2_32.lib)。

急问这是什么问题,应该怎么解决。

最新回复

0 -- 标准的读取操作,从系统缓冲拷贝数据到应用程序缓冲,并remove掉已经拷贝的数据; MSG_PEEK, 从系统缓冲拷贝数据到应用程序缓冲,系统缓冲中仍保留着已经拷贝的数据;   详情 回复 发表于 2008-3-7 23:56
点赞 关注

回复
举报

51

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看看你发送和接收的数据长度是否相符。
另外注意send函数的参数类型。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
长度一样不一样都试过了都没用,实际接收到的字符串长度是0,什么都接收不到。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
采用 WSAGetLastError 获得的错误码是10045。

请问怎么解决该问题,谢谢各位大虾拉
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
补充说明:

Socket创建时使用的套接字是SOCK_STREAM,调用recv函数接收数据时,接收不到具体数据内容。recv最后一个参数是MSG_PEEK
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
你把代码放上来看下,关键部分,这样实在不知道你问题处在哪里,可能是一些细节上出问题了。
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

7
 
服务端:
         WORD wVersion = MAKEWORD(2,2);
        WSADATA wsaData;

        int err = WSAStartup(wVersion,&wsaData);
        if(err != 0)
                return 0;

         SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, 0);

        sockaddr_in SockAddr;
        SockAddr.sin_family = AF_INET;
        SockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        SockAddr.sin_port = htons(5001);

        int nSockErr;
        if(bind(ListenSocket, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR)
                nSockErr = WSAGetLastError();

        if(listen(ListenSocket, 5) == SOCKET_ERROR)
                nSockErr = WSAGetLastError();

        while(bIsNetworkRunning)
        {
                SOCKET connectSocket = accept(ListenSocket, NULL, NULL);
                if(connectSocket == INVALID_SOCKET)
                        nSockErr = WSAGetLastError();
                else
                {
                        char pBuf[MAX_MSG_LEN];
                        memset(pBuf, 0, sizeof(char)*MAX_MSG_LEN);
                       
                           //每次能走到这里,但是接收不到具体数据。n为-1
                        int n = recv(connectSocket, pBuf, MAX_MSG_LEN*sizeof(char), MSG_PEEK);
                        if(n>0)
                        {
                                //其他操作
                        }//end if(n>0)
                        else
                                nSockErr = WSAGetLastError();
                }
               
                closesocket(connectSocket);
        }

        closesocket(ListenSocket);
        WSACleanup();


服务端:
                  wVersion = MAKEWORD(2,2);

                err = WSAStartup(wVersion,&wsaData);
                if(err != 0)
                        return ;

                SOCKET connectSocket = socket(AF_INET, SOCK_STREAM, 0);
                sockaddr_in servAddr;
                servAddr.sin_family = AF_INET;
                servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
                servAddr.sin_port = htons(5001);

                char pBuf[64] = "测试消息发送......";

                if(connect(connectSocket, (struct sockaddr *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
                        printf("连接错误\n");
                else
                {
                           //这里发送是正确的,发送完n为字符串长度
                        int n = send(connectSocket, pBuf, strlen(pBuf), MSG_DONTROUTE);
                        if(n<0)
                                int nSockErr = WSAGetLastError();
                }

                closesocket(connectSocket);
                WSACleanup();
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
WINCE是不支持MSG_PEEK参数的。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

9
 
我用MSG_OOB参数情况是一样的,具体哪些地方需要修改请明示,谢谢。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
没人看吗?大家帮帮忙啊,很急的,谢谢拉
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
你把MSG_PEEK参数换成0,试试看,不行再看。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
我晕,这么简单……现在可以了,多谢~~~参数为0是什么意思啊??
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
0 -- 标准的读取操作,从系统缓冲拷贝数据到应用程序缓冲,并remove掉已经拷贝的数据;
MSG_PEEK, 从系统缓冲拷贝数据到应用程序缓冲,系统缓冲中仍保留着已经拷贝的数据;
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表