VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1167|回复: 13

请网络编程高手进来指教!!!!!!!!!

[复制链接]

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-15 16:00:01 | 显示全部楼层 |阅读模式
初学网络编程,对socket的tcp传输掌握不够,
例如:
在服务端顺序发送三个包 1 -> 2 -> 3,而在客户端则乱序接收到 3 -> 1 -> 2,不解,
又如recv(s,buffer,1024,0)函数中指定从缓冲中取1024字节,结果recv返回分成了分别为800和224的两个包收到,又不解,
请高手指点迷津,不甚感激!!!
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-16 01:30:01 | 显示全部楼层
第一不解能描述一下你是怎么发送的吗?我也有点不解


对于你的第二个不解是由于粘包引起的,这对于tcp来说是正常的
回复

使用道具 举报

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-16 11:45:01 | 显示全部楼层
第一个问题造成的原因就是直接使用3个send函数,
不知是不是把3个包合为一个包send就不会出现这种情况
回复

使用道具 举报

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-16 12:30:01 | 显示全部楼层
以上是我胡思乱猜,第二种情况基本上自已可以处理,但是要是出现包次序混乱就不知如何处理
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-16 13:45:01 | 显示全部楼层
哦,我了解的 tcp 是不会出现这种情况的

在服务端顺序发送三个包 1 -> 2 -> 3,而在客户端则乱序接收到 3 -> 1 -> 2。
回复

使用道具 举报

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-16 15:00:01 | 显示全部楼层
不是一次出现这种情况了,折腾了很久
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-16 17:30:01 | 显示全部楼层
程序呢? 贴出来,包括套接字的创建部分
回复

使用道具 举报

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-16 21:30:02 | 显示全部楼层
服务端是VB,使用socket控件
   Dim r1(1023) As Byte
   Dim r2(1023) As Byte
   
   Dim r3(487) As Byte

   m_DeviceSocket.SendData r1
   m_DeviceSocket.SendData r2
   m_DeviceSocket.SendData r3

客户端c++
           #define MaxRecv 1024
           SOCKET        serverSocket;
           serverSocket = NULL;

          sockaddr_in m_addr;
         
          WORD version = MAKEWORD(2,0);
          WSADATA wsadata;
          WSAStartup(version,&wsadata);

          serverSocket = socket(AF_INET,SOCK_STREAM,0);
           m_addr.sin_family = AF_INET;
          m_addr.sin_addr.S_un.S_addr = inet_addr((char*)"192.168.1.243");
          m_addr.sin_port = htons(12343);

          connect(serverSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));

           CHAR recvStr[MaxRecv];

          long reclen = 0;

           while (1) {
                         memset(recvStr,0,sizeof(recvStr));
                         reclen = recv(serverSocket,recvStr,sizeof(recvStr),0);
           }
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-17 11:15:01 | 显示全部楼层
m_DeviceSocket.SendData r1
DoEvent
m_DeviceSocket.SendData r2
DoEvent
m_DeviceSocket.SendData r3
DoEvent

看看
回复

使用道具 举报

1

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-17 14:30:02 | 显示全部楼层
vb的socket不是立即发送的,doevent没有用,
function aa()
   Dim r1(1023) As Byte
   Dim r2(1023) As Byte
   
   Dim r3(487) As Byte

   m_DeviceSocket.SendData r1
   m_DeviceSocket.SendData r2
   m_DeviceSocket.SendData r3

end function
在VB中必须等end function 后才一起发送执行,微软封装的socket应该不会出现这种情况吧
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表