TCP实现不停发包解决方案
TCP实现不停发包
请教个问题,因为之前没接触过TCP和UDP,现在突然让我写个TCP程序测试网络,又没有资料,网上说的也都看了,但是还是不能用TCP实现服务器不停地发包;下面是我的做法,我想用一个while死循环实现,但是好像只能发出第一条,然后连接就断开了,不知道怎么回事:
服务器:
while(1)
{
send(sClient,szSend,strlen(szSend), 0);
sleep(10);//有人说这里如果不停地发送,必须sleep,我没有资料,不知道为什么,是因为缓冲的问题?
}
然后客户端接受:
char buff[1024*1024];//数据有点大,因为发送的每个包是50K,请教别人,别人让我把客户端缓冲设成1M
memset(buff,0,1024*1024);
int nRecv = recv(s, buff, 1024*1024 - 1, 0);
if(nRecv <= 0)
{
printf("服务器已关闭!\n");
}
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf("接收到数据:%s", buff);
memset(buff,0,1024*1024);
sleep(10);
}
请问下为什么不能实现不停地发,如果哪位有个例子就更好了,谢谢大家,我的邮箱1619095839@.qq.com
------解决方案--------------------
不是程序只能发一次,而是你的客户端只接了一次吧。。。
另外可以搜索下心跳包啊,这就是你的功能的名字吧
------解决方案--------------------
我把我的理解说一下:
原因主要是接收方的,因为你的发送的速率快于接收。
不论阻塞还是非阻塞,你接收程序收到数据后都要做一个数据拷贝的过程,这个过程需要时间,并且此时你的线程并没有监控网络端口。导致发送失败。
发送略加延迟,可以保证此时对方服务器是在等候的监控状态。
------解决方案--------------------
去看我发的一个帖子吧,你这里的发和收,都必须做控制,将socket加到 select 里面,等到socket可以发送,和可以收的时候,再发送和收,不然肯定有问题,
单靠 sleep(10)来控制发送机制,太过于理想化,当网络不好的时候,10毫秒也发不出去,要真正理解TCP流的概念。当socket的接收端缓冲区数据没接收完,你发送的速度会自动降低,就跟水压一样,
------解决方案--------------------
已发.491...那个Q是我的.有其它问题可以继续找我聊.
请教个问题,因为之前没接触过TCP和UDP,现在突然让我写个TCP程序测试网络,又没有资料,网上说的也都看了,但是还是不能用TCP实现服务器不停地发包;下面是我的做法,我想用一个while死循环实现,但是好像只能发出第一条,然后连接就断开了,不知道怎么回事:
服务器:
while(1)
{
send(sClient,szSend,strlen(szSend), 0);
sleep(10);//有人说这里如果不停地发送,必须sleep,我没有资料,不知道为什么,是因为缓冲的问题?
}
然后客户端接受:
char buff[1024*1024];//数据有点大,因为发送的每个包是50K,请教别人,别人让我把客户端缓冲设成1M
memset(buff,0,1024*1024);
int nRecv = recv(s, buff, 1024*1024 - 1, 0);
if(nRecv <= 0)
{
printf("服务器已关闭!\n");
}
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf("接收到数据:%s", buff);
memset(buff,0,1024*1024);
sleep(10);
}
请问下为什么不能实现不停地发,如果哪位有个例子就更好了,谢谢大家,我的邮箱1619095839@.qq.com
------解决方案--------------------
不是程序只能发一次,而是你的客户端只接了一次吧。。。
另外可以搜索下心跳包啊,这就是你的功能的名字吧
------解决方案--------------------
我把我的理解说一下:
原因主要是接收方的,因为你的发送的速率快于接收。
不论阻塞还是非阻塞,你接收程序收到数据后都要做一个数据拷贝的过程,这个过程需要时间,并且此时你的线程并没有监控网络端口。导致发送失败。
发送略加延迟,可以保证此时对方服务器是在等候的监控状态。
------解决方案--------------------
去看我发的一个帖子吧,你这里的发和收,都必须做控制,将socket加到 select 里面,等到socket可以发送,和可以收的时候,再发送和收,不然肯定有问题,
单靠 sleep(10)来控制发送机制,太过于理想化,当网络不好的时候,10毫秒也发不出去,要真正理解TCP流的概念。当socket的接收端缓冲区数据没接收完,你发送的速度会自动降低,就跟水压一样,
------解决方案--------------------
已发.491...那个Q是我的.有其它问题可以继续找我聊.