能力值:
(RANK:350 )
|
-
-
2 楼
首先你得看一下recv函数的原型:
int recv(
SOCKET s, //套接字描述符
char FAR *buf, //缓冲区
int len, //缓冲区buf的长度
int flags //附加标志,一般为0
);
|
能力值:
( LV9,RANK:250 )
|
-
-
3 楼
push 0 ; flags
push ebp ; len
add eax, edi
push eax ; buf
push dword_4890C4 ; s
call recv
那么就是说一个长的数据包会被切割成很多份,然后接受,那么的话应该是有个循环机制了,这个循环是在call recv中还是在recv后面的代码中实现呢?还是不停的调用recv呢?
|
能力值:
(RANK:410 )
|
-
-
4 楼
recv是将接收到的数据存放到Buff内存中去的(不是在eax中,eax只是一个Buff缓冲区地址指针而已),只要Buff内存缓冲足够大,就可以一次将所以数据接收完毕,并不会切割数据。
|
能力值:
( LV9,RANK:250 )
|
-
-
5 楼
我看过一段讲TCP/IP网络协议的书,它讲是数据在发送的时候,会被切割,然后在另一段会被组装,buff如果过大的情况,会被抛弃.等等..信息.然后我想问,在执行recv函数的时候buff中会是对方send()的全部数据麽?eax的大小是一定的啊,不能是放全部的数据吧?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
eax只是存放这个数据在内存的起始地址,我们的程序都是应用层的,你把传输层的操作和应用层的弄混了。
|
能力值:
(RANK:410 )
|
-
-
7 楼
分包和组包这些操作都在系统层里操作的,只要Buf缓冲区足够大,recv返回的包已经是完整的了。
|
能力值:
( LV9,RANK:250 )
|
-
-
8 楼
呵呵,弄混了数据包的切割是由TCP/IP来处理的,而那个TCP协议是在传输层~
|
|
|