xp下,tcp定时发送定长数据,开始出现粘包,处理后出现帧 频率达不到

izardMan 2014-12-09 01:07:35
SOCKET SendConnectSocket= INVALID_SOCKET,  // Window socket
SendDataSocket = INVALID_SOCKET; // Socket for communicating
SOCKADDR_IN local_sinSend, // Local socket address 监听端口
accept_sinSend; // Receives the address of the 接收端口地址 send
// connecting entity
int accept_sinSend_len; // Length of accept_sinPic
BOOL InitServerSend(void)
{
//////////////////////////////////////////////////////////////////
if ((SendConnectSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
// MessageBox (NULL, NULL, TEXT("Send socket() Error"), MB_OK);
return FALSE;
}
//////////////////////////////////////////////////////////////////
// 读配置文件
//--------------------------------------------------------------
if (bind (SendConnectSocket,(struct sockaddr *) &local_sinSend,
sizeof (local_sinSend)) == SOCKET_ERROR)
{
// MessageBox (NULL, NULL, TEXT("Send Socket bind() Error"), MB_OK);
closesocket (SendConnectSocket);
return FALSE;
}
//---------------------------------------------------------------------------
// Establish a socket to listen for incoming connections.
int iRet=listen(SendConnectSocket, SOMAXCONN);
// Stop listening for connections from clients.
accept_sinSend_len = sizeof (accept_sinSend);

SendDataSocket = accept (SendConnectSocket, (struct sockaddr *) &accept_sinSend, (int *) &accept_sinSend_len); // Accept an incoming connection attempt on WinSocket.
closesocket (SendConnectSocket); // Stop listening for connections from clients.
int sendBufLen=0;
int len=sizeof(sendBufLen);
getsockopt(SendDataSocket,SOL_SOCKET,SO_SNDBUF,(char*)&sendBufLen,&len);
sendBufLen=32;
setsockopt(SendDataSocket,SOL_SOCKET,SO_SNDBUF,(char*)&sendBufLen,len);
return TRUE;
}

void SendData() // 线程函数
{

unsigned char* bDataRec=(unsigned char*)malloc(1024);
int iReadLen=0; //wzm 2014-12-6
InitServerSend();
while(1)
{
iReadLen = recv (SendDataSocket, (char*)bDataRec, 1024, 0);
if(iReadLen>0)
{

}
else
{
closesocket(SendDataSocket);
InitServerSend();
}
Sleep(1);//60000 WZM 2014-12-3
}
}
AfxBeginThread(AFX_THREADPROC(&SendHandleData), NULL,0);//网口线程

void SendHandleData() // 线程函数
{

while(1)
{
if(g_SoftwareState==0)
{
return;
}
if(g_pTeleControlerDlg->m_b_IsSending)
{
send(SendDataSocket,(const char*)sendBuf,32,0);
}
Sleep(4);//60000 WZM 2014-12-7
}
}

...全文
628 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-01-25
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
一根葱的无奈 2016-01-24
  • 打赏
  • 举报
回复
tcp 本来就是面向流的,你要在字节流中自己把数据包提取出来
野男孩 2015-01-05
  • 打赏
  • 举报
回复
第一次看到用赫兹来表示TCP链接的发包速度的。。。。楼主是通信行业的吧。。。 粘包的问题是tcp协议的特性,本来就是流式传输,无所谓粘不粘的问题。 速度是收发双方的,和物理链路也有关系。带宽够,对方接收慢,也没用。抓包看看卡在哪了,哪边的tcp窗口有为0的情况没,多半是收端。发送的速度应该是问题不大的,10HZ这么小。。。除非包超级大
skyabc 2015-01-03
  • 打赏
  • 举报
回复
按楼主的说法,发送出来的频率为6到10HZ,不知道楼主设定的频率为多少呢。这么低的频率,正常一般不会粘包,楼主是否还有其它通讯程序占用网络,很多网卡自己带流量控制的,在以太网层面,来不及接收,就会发请求对方延时发送的以太网电文,很早以前开发过板卡程序,就因为该情况,到一定频率下无法提高通讯速率。
wyx100 2015-01-03
  • 打赏
  • 举报
回复
引用 17 楼 LinuxCard 的回复:
关闭那个合并发送的算法试试,n什么什么的算法,让包直接发送
LinuxCard 2015-01-03
  • 打赏
  • 举报
回复
关闭那个合并发送的算法试试,n什么什么的算法,让包直接发送
「已注销」 2014-12-10
  • 打赏
  • 举报
回复
引用 14 楼 wuzongman 的回复:
我作为服务端,只管发送定长帧,定时发送,用网络调试助手接收到只有4HZ,但是用wareshark在服务端看发出的有6到10hz,这又是为啥。各位大神呢???
引用 7 楼 wuzongman 的回复:
可以这么说,怎么增加输出 频率是现在面临的问题,希望楼上的不吝赐教 。
不要缩小socket缓冲大小,就可以增加。
izardMan 2014-12-09
  • 打赏
  • 举报
回复
我作为服务端,只管发送定长帧,定时发送,用网络调试助手接收到只有4HZ,但是用wareshark在服务端看发出的有6到10hz,这又是为啥。各位大神呢???
dvlinker 2014-12-09
  • 打赏
  • 举报
回复
TCP是有粘包问题的,先定义好协议; 对于发送端,先传数据体长度,然后再串数据体buffer; 对于接收端,先接收数据体长度,再根据数据体长度循环接收数据体buffer; 由于TCP底层可能会根据当前网络拥塞情况,进行切包,所以上层接收时需要多次循环接收,直到接收到指定长度为止。
izardMan 2014-12-09
  • 打赏
  • 举报
回复
协议早已定好,无法更改
izardMan 2014-12-09
  • 打赏
  • 举报
回复
协议早已定好,无法更改
赵4老师 2014-12-09
  • 打赏
  • 举报
回复
及早改用UDP才是正途。我觉得。
izardMan 2014-12-09
  • 打赏
  • 举报
回复
那谁可以告诉我PSH怎么设置
izardMan 2014-12-09
  • 打赏
  • 举报
回复
为什么我设置线程一直发送,但是接收到的只有4hz
izardMan 2014-12-09
  • 打赏
  • 举报
回复
可以这么说,怎么增加输出 频率是现在面临的问题,希望楼上的不吝赐教 。
「已注销」 2014-12-09
  • 打赏
  • 举报
回复
tcp根本不存在所谓沾包,毋宁说是因为 1 对tcp的错误理解 2. 不懂得解析协议 的另一种说法。 tcp概念里没有包,只有流。 设置缓冲变小,当然会导致数据通量变小。
izardMan 2014-12-09
  • 打赏
  • 举报
回复
是否要设置为非阻塞模式,我的缓冲区已经设置的只有32个字节了,坐等 回复
izardMan 2014-12-09
  • 打赏
  • 举报
回复
数据也就是包的数量没变,只是长度变得正常了,我希望的频率还没达到
izardMan 2014-12-09
  • 打赏
  • 举报
回复
本来要以10hz发32字节的包,粘包时以3-·4hz 发96字节的包,处理粘包后 ,以3-·4hz发了 32 字节的包。
加载更多回复(2)

18,363

社区成员

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

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