socket通讯可靠性
写了一个socket通信程序,客户端和服务端要来回传递多个消息,发送、接收如下:
程序调试没有问题,可是真正跑起来后,发现总是出现发送或接收失败的情况,而且还是在同一个机器上,如果真部署到实际网络中,我觉得出现错误的可能性更大,那该怎么处理才能让tcp通讯更可靠呢?
/*-------------------------------------------------------------------
SOCKETROUTE.C——阻塞模式下使用的常用子程序
(c)by 浅墨浓香,2015.6.25
---------------------------------------------------------------------*/
#include <windows.h>
#include "Message.h"
#include "SocketRoute.h"
#pragma comment(lib,"Ws2_32.lib")
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 在规定的时间内等待数据到达
// 输入:dwTime = 需要等待的时间(微秒)
// 返回值:0 ——超时而返回
// SOCKET_ERROR ——出错而返回
// X(x>0) ——就绪的套接字数量
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int WaitData(SOCKET sock, DWORD dwTime)
{
FD_SET fds;
TIMEVAL tv;
fds.fd_count = 1;
fds.fd_array[0] = sock;
tv.tv_sec = 0;
tv.tv_usec = dwTime;
return select(0, &fds, NULL, NULL, &tv);
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 接收规定字节的数据,如果缓冲区中的数据不够则等待
// 返回:FALSE,连接中断或发生错误
// TRUE,成功
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BOOL RecvData(SOCKET sock, char* pBuffer, int nBytes)
{
int nStartTime;
int nRet,nRecv;
nStartTime = GetTickCount();
nRecv = 0;
while ((GetTickCount()-nStartTime)<10*1000) //查看是否超时
{
nRet = WaitData(sock, 100 * 1000); //等待数据100ms
if (SOCKET_ERROR == nRet) //连接错误
return FALSE;
if (0 == nRet) //超时
break;
do
{
//接收数据,直至收完指定的字节数
nRecv += recv(sock, pBuffer + nRecv, nBytes - nRecv, 0);
if (nRecv == SOCKET_ERROR || nRecv == 0)
return FALSE;
if (nRecv == nBytes)
return TRUE;
} while (nRecv < nBytes);
}
return TRUE;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 接收一个符合规范的数据包
// 参数: pBuffer用来接收数据的缓冲区
// nBytes 数据区最大的空间
// 返回: FALSE——失败
// TRUE ——成功
//注意:这里的nBytes不要指要接收的字节数,只是用来判断缓冲区是否只够大
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BOOL RecvPacket(SOCKET sock, char* pBuffer, int nBytes)
{
MSGSTRUCT* pMsgStruct;
int iRet;
pMsgStruct = (MSGSTRUCT*)pBuffer;
//接收数据包头部并检测数据是否正常
iRet = RecvData(sock, pBuffer, sizeof(MSGHEAD));
if (iRet) //如果成功接收数据
{
if (pMsgStruct->MsgHead.cbSize <= sizeof(MSGHEAD) ||
pMsgStruct->MsgHead.cbSize > nBytes)
return FALSE;
//接收余下的数据
iRet = RecvData(sock, pBuffer + sizeof(MSGHEAD), pMsgStruct->MsgHead.cbSize - sizeof(MSGHEAD));
}
return iRet;
}
程序调试没有问题,可是真正跑起来后,发现总是出现发送或接收失败的情况,而且还是在同一个机器上,如果真部署到实际网络中,我觉得出现错误的可能性更大,那该怎么处理才能让tcp通讯更可靠呢?
...全文
相关推荐
ABB_socket通讯
在实际操作时,需要注意网络环境的设置、通信协议的选择以及数据传输的可靠性和实时性。
Socket通讯
TCP的可靠性使得它更适合对数据完整性和顺序有严格要求的应用场景。3. **Socket编程**: Socket是操作系统提供的接口,用于实现网络上的进程间通信。
很实用的 socket通讯工具
UDP Socket通讯:UDP(User Datagram Protocol)是一种无连接的协议,它不保证数据的顺序或可靠性,但具有更低的延迟。
即时通讯框架(socket 异步通讯)
Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。TCP提供面向连接的服务,保证数据的有序、无丢失传输;UDP则是无连接的,数据传输不保证可靠性,但速度快。
基于socket应用的TCP/Ip通讯
本文将深入探讨基于Socket应用的TCP/IP通讯,包括其工作原理、实现方式以及如何通过服务端和客户端进行交互。


