这是为什么,关于socket的Receive Buffer问题?

worldcup 2003-11-19 06:59:57
我在写一个socket client端的接收程序时,代码(1)处如果为100,好象接收不到server发的数据,如果100改为更小,接收的为乱码,如果改的大一些,如128,则可以正常接收,不知这是为什么?麻烦大家解释一下,谢谢!!!

unsigned char p[201]; //rece buffer
ZeroMemory(p,sizeof(p));

m_pSocket->Receive(p,100); // (1)

...........

感觉自己还是不理解接收发送缓冲区的原理!
还有,如果100处用一个变量,如何知道接收缓冲区已经空了??
接收端如何知道发送方发送了多少字节的数据?
...全文
234 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbmsf 2003-11-26
  • 打赏
  • 举报
回复
你的想法是可行的,也是正确的。
worldcup 2003-11-26
  • 打赏
  • 举报
回复
up
worldcup 2003-11-26
  • 打赏
  • 举报
回复
谢谢fbmsf!
worldcup 2003-11-25
  • 打赏
  • 举报
回复
感谢大家的解答!

意思是不是说在发送未知大小的数据时,接收方有可能一次接收不完,此时必须接收多次,直到接收完毕!具体编程时可以用一个循环来实现.不知我想的是否正确?

还有,发送方可不可以先将要发送的字节数发给接收方,接收方收到该值后再去接收指定大小的数据,不知是否可行?有什么缺点?
欢迎大家继续指教!!!
raphyer 2003-11-21
  • 打赏
  • 举报
回复
tcp 接收不完全没有错
UDP:
以每个数据报为界接收
如果数据报大于你定义的程序缓冲区大小
就截取等于程序缓冲区大小的数据(乱码)
返错 WSAEMSGSIZE
Probug 2003-11-20
  • 打赏
  • 举报
回复
TCP只是传输协议,只保证传输数据正确到达,你还应该在它之上封上自己的应用协议,指明数据是做什么用的,长度为多少等等信息。
byjhappy 2003-11-20
  • 打赏
  • 举报
回复
接收端接收的字符个数要与发送端发送的字符个数应该一致,否则,下一次接收就会出现问题
byjhappy 2003-11-20
  • 打赏
  • 举报
回复
接收端发送的字符个数要与发送端发送的字符个数应该一致,否则,下一次接收就会出现问题
fbmsf 2003-11-19
  • 打赏
  • 举报
回复

recv 其实应该算是不严格的,你想收1024byte,但实际上收了512字节,其实是没有错的,你应该马上继续收剩下的,直到收完了1024,这儿应该用一个递归来写。
Windmoon_hz 2003-11-19
  • 打赏
  • 举报
回复
接收端如何知道发送方发送了多少字节的数据?----这个就根据自己定义的协议来
mingcedar 2003-11-19
  • 打赏
  • 举报
回复
即使Receive()返回值>0,也不能说明没错,有可能接收到部分内容,但不全。
一般情况下,接收缓冲区小于发送缓冲区就要出错,大于发送缓冲区时,如果网络正常一般不会出错。
huanyun 2003-11-19
  • 打赏
  • 举报
回复
Receive(p,100); 返回的时候判断是否成功
如果失败返回SOCKET_ERROR
调用
static int GetLastError( );
获取错误的原因
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.


WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.


WSAENOTCONN The socket is not connected.


WSAEINPROGRESS A blocking Windows Sockets operation is in progress.


WSAENOTSOCK The descriptor is not a socket.


WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.


WSAESHUTDOWN The socket has been shut down; it is not possible to call Receive on a socket after ShutDown has been invoked with nHow set to 0 or 2.


WSAEWOULDBLOCK The socket is marked as nonblocking and the Receive operation would block.


WSAEMSGSIZE The datagram was too large to fit into the specified buffer and was truncated.


WSAEINVAL The socket has not been bound with Bind.


WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.


WSAECONNRESET The virtual circuit was reset by the remote side.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧