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
}
}

...全文
748 22 打赏 收藏 转发到动态 举报
写回复
用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)
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工况下的运行机理与性能表现,并基于Simulink平台构建了完整的仿真模型进行验证。文章详细阐述了LLC谐振变换器的电路拓扑结构、工作原理、关键参数设计方法以及移相控制策略的实现机制,重点对电压增益特性、转换效率、软开关实现条件等核心性能指标进行了仿真分析,全面评估了系统在宽输入电压范围内的稳定性、动态响应能力及高效运行区间。; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校研究生、科研机构研究人员以及从事高频开关电源、DC-DC变换器设计的工程技术人员;要求读者具备扎实的电路理论基础和一定的Simulink仿真应用经验。; 使用场景及目标:①深入掌握LLC谐振变换器的基本原理与数学建模方法;②理解并应用移相控制策略以提升高效率DC-DC变换器的性能;③通过仿真实践优化谐振腔参数(如谐振电感、励磁电感、谐振电容)与开关频率配置,提高电源系统的整体能效、功率密度和可靠性,服务于实际工程中的电源产品开发与性能验证。; 阅读建议:建议读者结合提供的Simulink仿真模型同步操作,重点探究谐振元件参数变化对系统增益曲线和ZVS软开关实现条件的影响,尝试调节移相角与开关频率以观察动态响应过程,从而深化对LLC变换器高频软开关特性和控制策略的理解。

18,356

社区成员

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

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