关于socket不能循环接受数据的问题?

liujianleiwj 2002-09-22 06:54:54
客户端程序:
.
.
.
for (int i=1;i<4;i++)
{
send(sock,"aa",2,0)
}

服务器端程序:
.
.
.
for(;;)
{
if((socket_connect=accept(sock,(LPSOCKADDR) &addr, &len))==SOCKET_ERROR)
{
printf("accept error!\n");
perror("accept");
}

recv(socket_connect,buf,2,0);
}

为什么客户端循环发了三遍,服务器端只收到了一遍???????????????????????
...全文
45 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujianleiwj 2002-09-25
  • 打赏
  • 举报
回复
谢谢朋友们的照顾,以上朋友们的方法都试过了,如将客户端与服务器端的循环次数设为一致,客户端的每发送一个循环后进行延时,可还是只能接收到一次,是不是程序无法控制??????????
zfnlj 2002-09-25
  • 打赏
  • 举报
回复
我觉得不会是收的次数的问题。
因为是个while(true)的循环,
只要缓冲区里有数据没有收完,
就会越过s = select(1,&input_set,
NULL,&exc_set,NULL);这个阻塞继
续收。
是不是真的发了6字节,看一下send的
返回值。
zb_china 2002-09-25
  • 打赏
  • 举报
回复
TCP数据没有边界,接收次数和发送次数没有关系
liujianleiwj 2002-09-25
  • 打赏
  • 举报
回复
唉,算了吧,多谢大家帮助,如果以后有解答,或有这方面的资料,通知一声,邮箱地址:99ljl@sohu.com 谢谢。
HeShe 2002-09-25
  • 打赏
  • 举报
回复
up
zfnlj 2002-09-25
  • 打赏
  • 举报
回复
呵呵,不要着急呀,这部分绝对能控制的。
你看看int ret=send(socket,,"aaaaaa",6,0)的
返回值和服务器收的情况。这一阵我也一直在
写这部分的代码,不过这地方都没出什么问题
过。另外,多认真看一下msdn中的讲send ,recv,
select的帮助,很多东西你就会明白。
mr_fanwei 2002-09-24
  • 打赏
  • 举报
回复
socket_connect 这是一个连接套接字,但是你使用recv只是在其中接受了一次。

这里有一个tcpip本身的问题:你使用三次send(客户端),但是你无法知道协议层如何发包。即:几次发出去,一次发多少。这不能由应用程序控制。

建议:
1)接受方进行控制。
2)阅读TCPIP源代码,自己修改其中应用层和协议层的接口。
后者我正在努力,估计年底之前会有眉目。(大部分时间不是我得)

祝你 好运!欢迎给分!(^_^)
flinming 2002-09-24
  • 打赏
  • 举报
回复
每循环一次延时一会儿试试,有时候发太快了,也会出问题!
polehorse 2002-09-24
  • 打赏
  • 举报
回复
同意 mr_fanwei(风之子) 说法,应该看看收到的是什么内容,接收次数和发送次数可以不等的
class 2002-09-23
  • 打赏
  • 举报
回复
应该是s = select(1,&input_set,NULL,&exc_set,NULL);
的参数有问题,
改成:
s = select(socket_connect+1,&input_set,NULL,&exc_set,NULL);
试试
hohoo 2002-09-23
  • 打赏
  • 举报
回复
这一般是因为发送或接收过程进行了优化运算,将小包组合成一个大包发送或接收。
liujianleiwj 2002-09-22
  • 打赏
  • 举报
回复
按照江湖小侠的指示操作,加了以上代码,但还是只能接受一次,将sock改成socket_connect还是一样,帮帮忙.
zfnlj 2002-09-22
  • 打赏
  • 举报
回复
对不起,中间的sock 要改成socket_connect。
一时没看清。:)
zfnlj 2002-09-22
  • 打赏
  • 举报
回复
我写详细一点的出来。
socket_connect=accept(sock,(LPSOCKADDR) &addr, &len);

while(true)
{
fd_set input_set, exc_set;
FD_ZERO(&input_set);
FD_ZERO(&exc_set);
FD_SET(sock,&input_set);
FD_SET(sock,&exc_set);
s = select(1,&input_set,NULL,&exc_set,NULL);
if (FD_ISSET(sock,&exc_set)
{
break;
}
else if(FD_ISSET(sock,&input_set)
{
recv(socket_connect,buf,2,0);
}
}
zfnlj 2002-09-22
  • 打赏
  • 举报
回复
你改成这样吧。

socket_connect=accept(sock,(LPSOCKADDR) &addr, &len)
for(;;)
{
  recv(socket_connect,buf,2,0);
}
你那种写法不太对。
CTimerain 2002-09-22
  • 打赏
  • 举报
回复
从你贴出的代码上看,同意lyck(长空) 的看法

但如果你的程序是异步,非阻塞的话

那就有问题了
:)
zfnlj 2002-09-22
  • 打赏
  • 举报
回复
收的次数是可能和发的不一样。
不过从程序看发了6字节,但
一次只收了2字节,应该不对。
lyck 2002-09-22
  • 打赏
  • 举报
回复
按程序而言,产生这种结果是正确的。在服务器端程序中,只接收了一次recv

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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