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

解决方案 »

  1.   

    为啥一直是4Hz左右,达不到10Hz,之前加入的设置代码为:
    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);
      

  2.   

    本来要以10hz发32字节的包,粘包时以3-·4hz 发96字节的包,处理粘包后 ,以3-·4hz发了 32  字节的包。
      

  3.   

    tcp根本不存在所谓沾包,毋宁说是因为1   对tcp的错误理解
    2.  不懂得解析协议的另一种说法。tcp概念里没有包,只有流。设置缓冲变小,当然会导致数据通量变小。
      

  4.   

    那谁可以告诉我PSH怎么设置
      

  5.   

    及早改用UDP才是正途。我觉得。
      

  6.   

    TCP是有粘包问题的,先定义好协议;
    对于发送端,先传数据体长度,然后再串数据体buffer;
    对于接收端,先接收数据体长度,再根据数据体长度循环接收数据体buffer;
    由于TCP底层可能会根据当前网络拥塞情况,进行切包,所以上层接收时需要多次循环接收,直到接收到指定长度为止。
      

  7.   

    我作为服务端,只管发送定长帧,定时发送,用网络调试助手接收到只有4HZ,但是用wareshark在服务端看发出的有6到10hz,这又是为啥。各位大神呢???
      

  8.   

    建议你使用
    CxUdpSocket
    http://www.cnblogs.com/EdmundDwyane/p/3218838.html
    CxClientSocket
    http://www.cnblogs.com/EdmundDwyane/p/3248297.html
    CxServerSocket
    http://www.cnblogs.com/EdmundDwyane/p/3278641.html
      

  9.   


    不要缩小socket缓冲大小,就可以增加。
      

  10.   

    第一次看到用赫兹来表示TCP链接的发包速度的。楼主是通信行业的吧粘包的问题是tcp协议的特性,本来就是流式传输,无所谓粘不粘的问题。速度是收发双方的,和物理链路也有关系。带宽够,对方接收慢,也没用。抓包看看卡在哪了,哪边的tcp窗口有为0的情况没,多半是收端。发送的速度应该是问题不大的,10HZ这么小除非包超级大
      

  11.   

    tcp 本来就是面向流的,你要在字节流中自己把数据包提取出来
      

  12.   

    不知道有多少前人掉在TCP Socket
    send(人多)send(病少)send(财富)
    recv(人多病)recv(少财富)
    陷阱里面啊!
    http://bbs.csdn.net/topics/380167545