如何清空send函数的socket?

Scorpio_Love 2011-05-20 10:02:50
使用这个来发送:send(sockClient,(char *)newBuf,newBuf[0],0);//发信息,newBuf[0]存放数据长度
我在Server端需要不断地用while循环来发送数据,出现的问题是第一次循环发送ABC,对方接收到的是ABC;第二次循环发送DEF,对方这里却接收到了ABCDEF,我查了下原因是send是把newBuf的信息copy到scokClient的发送队列去,所以我想每次发送完把这个sockClient的发送队列清空,有什么函数可以使用啊?
...全文
267 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
西湖秀才 2011-05-26
  • 打赏
  • 举报
回复
setsockopt先把SND_BUF设置为0,然后再恢复,应该可行吧
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
发送缓冲区和接受缓冲区要分开 一个sendBuf一个recvBuf(不分开回导致很多不好找的问题)
accept就放到循环里面,建一个链表,把链接上来的客户端发到链表里面,单开一个线程来处理数据的首发
这是正规的模式
建议楼主找本书看看
推荐《精通windows sockets网络开发》
Scorpio_Love 2011-05-20
  • 打赏
  • 举报
回复
socket类型是SOCKET_STREAM的,服务器这里本来应该用两个线程来对应不同的连接,我只是为了简单测试下就直接写成这样了
Scorpio_Love 2011-05-20
  • 打赏
  • 举报
回复
THX~
其实我在客户端也有这个问题,开始我用了memset清空newBuf,但是没有用,不是这个原因,于是我就每次循环后都关闭掉这个连接,下次发送再建立连接,这样就没了上面的问题,但在服务器端可以把下面红色代码放到循环内吗?

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);

bind(sockSrv0,(SOCKADDR*)&addrSrv0,sizeof(SOCKADDR));
listen(sockSrv0,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

SOCKADDR_IN addrClient0;
int len0=sizeof(SOCKADDR);

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
SOCKET sockConn0=accept(sockSrv0,(SOCKADDR*)&addrClient0,&len0);


while(1)
{
printf("*******start*******\n\n");
recv(sockConn,(char *)recvBuf,500,0);//从Client1接收信息

printf("%d ",recvBuf[0]);
for(int q=1;q<recvBuf[0];q++)
printf("%2x ",recvBuf[q]);
printf("\n\n");

send(sockConn0,(char *)recvBuf,recvBuf[0],0);//发送到Client2

recv(sockConn0,(char *)recvBuf,500,0);//从Client2接收信息

printf("%d ",recvBuf[0]);
for(int q0=1;q0<recvBuf[0];q0++)
printf("%2x ",recvBuf[q0]);
printf("\n\n");

send(sockConn,(char *)recvBuf,recvBuf[0],0);//发送到Client1

printf("*******end*******\n\n");

}
closesocket(sockConn);
closesocket(sockConn0);

zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 buyong 的回复:]
我这里也用send和recv,也没清空什么,也没出现过这种情况

引用楼主 scorpio_love 的回复:
使用这个来发送:send(sockClient,(char *)newBuf,newBuf[0],0);//发信息,newBuf[0]存放数据长度
我在Server端需要不断地用while循环来发送数据,出现的问题是第一次循环发送ABC,对方接收到的是ABC;第二次循环发送DEF……
[/Quote]
很有可能 把def赋值给newBuf时出了问题
buyong 2011-05-20
  • 打赏
  • 举报
回复
你的socket类型是不是SOCK_STREAM
buyong 2011-05-20
  • 打赏
  • 举报
回复
我这里也用send和recv,也没清空什么,也没出现过这种情况
[Quote=引用楼主 scorpio_love 的回复:]
使用这个来发送:send(sockClient,(char *)newBuf,newBuf[0],0);//发信息,newBuf[0]存放数据长度
我在Server端需要不断地用while循环来发送数据,出现的问题是第一次循环发送ABC,对方接收到的是ABC;第二次循环发送DEF,对方这里却接收到了ABCDEF,我查了下原因是send是把newBuf的信息copy到scokClient的发送队列……
[/Quote]
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 scorpio_love 的回复:]
引用 4 楼 zuiyuezhou888 的回复:
引用 2 楼 scorpio_love 的回复:
多些关注,不过我的意思不是把newBuf清空,而是要把socket里面的发送队列清空,这是个系统的队列吧,好像有什么select函数的,求指导

您所说的select模型中的 FD_ZERO(FD_SET * set)宏?将set集合中的套接字初始化为空集合

好像是这样吧,我没了解过……
[/Quote]
FD_ZERO仅仅是把set中的套接字置为空,与发送缓冲区没关系
Eleven 2011-05-20
  • 打赏
  • 举报
回复
你接收端代码怎么处理的?
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 scorpio_love 的回复:]
看来我没说清楚额
例如:send(sockClient,(char *)newBuf,newBuf[0],0);//发信息,newBuf[0]存放数据长度

send只是把newBuf里面的内容copy到sockClient的发送缓冲区,但由于我每次的newBuf的内容比较小,所以导致sockClient的发送缓冲区还有剩余空间,所以copy的时候就直接把DEF放到ABC后面的剩余空间了,……
[/Quote]
你发abc的时候是不是把 abc放在newBUf里面,你发def的时候是不是也放在了newBuf里面,楼主把这段代码贴一下吧!memset应该能解决你说的问题,先试一下,试了还不行 就把那段代码贴出来
Scorpio_Love 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zuiyuezhou888 的回复:]
引用 2 楼 scorpio_love 的回复:
多些关注,不过我的意思不是把newBuf清空,而是要把socket里面的发送队列清空,这是个系统的队列吧,好像有什么select函数的,求指导

您所说的select模型中的 FD_ZERO(FD_SET * set)宏?将set集合中的套接字初始化为空集合
[/Quote]
好像是这样吧,我没了解过这个,刚看了篇文章是讲这个的
http://blog.csdn.net/l_z_s_001/archive/2009/10/19/4697735.aspx
我再研究研究,再次感谢!~
Scorpio_Love 2011-05-20
  • 打赏
  • 举报
回复
看来我没说清楚额
例如:send(sockClient,(char *)newBuf,newBuf[0],0);//发信息,newBuf[0]存放数据长度

send只是把newBuf里面的内容copy到sockClient的发送缓冲区,但由于我每次的newBuf的内容比较小,所以导致sockClient的发送缓冲区还有剩余空间,所以copy的时候就直接把DEF放到ABC后面的剩余空间了,然后我再次send的时候,就理所当然地把sockClient的发送缓冲区里的所有内容即ABCDEF发了出去
为了每次都发送新的消息,我就需要把sockClient的发送缓冲区清空,这里就是不知道怎么弄,如何清空了
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scorpio_love 的回复:]
多些关注,不过我的意思不是把newBuf清空,而是要把socket里面的发送队列清空,这是个系统的队列吧,好像有什么select函数的,求指导
[/Quote]
您所说的select模型中的 FD_ZERO(FD_SET * set)宏?将set集合中的套接字初始化为空集合
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scorpio_love 的回复:]
多些关注,不过我的意思不是把newBuf清空,而是要把socket里面的发送队列清空,这是个系统的队列吧,好像有什么select函数的,求指导
[/Quote]
socket里面的发送队列清空?你所说的发送队列是指连接的客户端?-如果是客户端的话,应该是你自己定义的链表吧
不是很明白楼主的意思,但是从现象中来看应该是没有把发送缓冲区清空
Scorpio_Love 2011-05-20
  • 打赏
  • 举报
回复
多些关注,不过我的意思不是把newBuf清空,而是要把socket里面的发送队列清空,这是个系统的队列吧,好像有什么select函数的,求指导
zuiyuezhou888 2011-05-20
  • 打赏
  • 举报
回复
memset(newBuf,0,newBuf的长度)

18,356

社区成员

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

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