socket中收发的代码,请帮忙解释一下!解决办法
socket中收发的代码,请帮忙解释一下!
------解决方案--------------------
你要发10个字节,在实际网路中,可能分若干次,每次若干字节发送,这个不受你控制
接收也是,可能一次,可能10次,每次收1个字节,也不受你控制,
你能控制的(tcp):
你先send的数据,那边一定先recv,顺序相同
你send的字节数最终和recv的总字节数相同
recv成功后,做为send一方你是知道的,但这个时间不确定
网络断开后,winsock不一定会通知你,
ps:如果是异步,你发的函数都要加上10035的判断
------解决方案--------------------
- C/C++ code
int CRE_Socket::send_SVR(char * data, int size) { if (m_sockconn != SOCKET_ERROR) { int nLeft, nWritten; nLeft = size; char *dataTemp = data; while (nLeft > 0) { //循环中,如果send发送的字节数不是定义的长度, nWritten = send(m_sockconn,dataTemp, nLeft, 0); if (nWritten == SOCKET_ERROR) return nWritten; //那么让nLeft减去实际发送的长度 nLeft -= nWritten; //并且指向数据的指针也往后移动到了实际发送长度后。 dataTemp += nWritten; //我想问的是,如果实际发送长度不等于定义长度,直接就 //重发呗,为啥还要从数据的中间再发送(dataTemp += nWritten;)? //下面的recv也是同问,如果接收的数据包不够指定长度那就丢弃不处理,并要求服务器重发呗,为啥还要循环读取? //我是新手,请老手详细讲讲!谢谢啊!! } return size - nLeft; } else { return SOCKET_ERROR; } } int CRE_Socket::recv_SVR(char * data, int size) { if (m_sockconn != SOCKET_ERROR) { int nLeft, nWritten; nLeft = size; char *dataTemp = data; while (nLeft > 0) { nWritten = recv(m_sockconn,dataTemp,nLeft,0); if (nWritten == SOCKET_ERROR) return nWritten; nLeft -= nWritten; dataTemp += nWritten; } return size - nLeft; } else { return SOCKET_ERROR; } }
------解决方案--------------------
你要发10个字节,在实际网路中,可能分若干次,每次若干字节发送,这个不受你控制
接收也是,可能一次,可能10次,每次收1个字节,也不受你控制,
你能控制的(tcp):
你先send的数据,那边一定先recv,顺序相同
你send的字节数最终和recv的总字节数相同
recv成功后,做为send一方你是知道的,但这个时间不确定
网络断开后,winsock不一定会通知你,
ps:如果是异步,你发的函数都要加上10035的判断
------解决方案--------------------