发送数据时出现套接字问题
Socket issue in send data
我在Linux上使用C++中的套接字发送数据(10个文件,每个文件大约10-20kb)。
我在服务器中的伪代码:
for(i=0;i<10;i++){
ret = send(sockfd, filedata, filedatasize, 0);
}
ret
为所有数据文件返回正确的文件大小,没有错误,但客户端只接收4-5个文件。
但是,如果我用这个代替:
for(i=0;i<10;i++){
ret = send(sockfd, filedata, filedatasize, 0);
sleep(1);
}
客户端接收所有文件,而不是错误!
问题出在哪里?
我试着调整SO_RCVBUF
和SO_SNDBUF
,但没有改变。
编辑:(完整的代码有200000行要粘贴!)
这是服务器代码:
int Socket::sendMsg(char * data, unsigned int uiSize)
{
unsigned short * us;
int i, iRet;
us = (unsigned short *)(m_pSendBuffer);
*us = (unsigned short)(uiSize + 2);
memcpy((char *)m_pSendBuffer + 2, data, uiSize);
iRet = isend(m_pSendBuffer, uiSize + 2);
if (iRet<0) {
return SOCKET_ERROR;
}
return iRet;
}
int Socket::isend(char * data, int size)
{
int outlen, ret;
outlen= 0;
while (outlen< size) {
ret= send(sockfd, (data+ outlen), size - outlen, 0);
if (ret< 0) {
return -1;
}
else outlen+= ret;
}
return outlen;
}
这是客户端代码:
void XSocket::onRead()
{
int iRet;
unsigned short * usp;
unsigned int uiReadSize;
while (1) {
iRet = recv(m_Sock, (char *)m_pRecvBuffer, 2, 0);
uiReadSize = 0;
usp = (unsigned short *)(m_pRecvBuffer);
uiReadSize = (int)(*usp - 2);
iRet = recv(m_Sock, (char *)(m_pRecvBuffer + 2), uiReadSize, 0);
if (iRet < 0) {
//return error
}
else if (iRet == 0) {
//disconnect
}
//PROCCESS MSG
}
}
在客户端:
-
您没有对第一个
recv()
调用进行任何错误处理,如果服务器正常断开连接,您的第二个recv()
调用也没有中断循环。 -
您不是循环读取每个数据缓冲区,就像在服务器端循环发送数据一样。发送的字节数和接收的字节数之间没有1对1的关系。如果您期望X个字节到达,请继续读取,直到您实际收到那么多字节。
考虑到这些错误,无法保证您的客户端确实正确接收到了所有数据。
试试类似的东西:
void XSocket::onRead()
{
int iRet;
unsigned short * usp;
unsigned int uiReadSize;
while (1) {
iRet = irecv((char *)m_pRecvBuffer, 2);
if (iRet<= 0) {
break;
}
usp = (unsigned short *)(m_pRecvBuffer);
uiReadSize = (int)(*usp - 2);
iRet = irecv((char *)(m_pRecvBuffer + 2), uiReadSize);
if (iRet<= 0) {
break;
}
//PROCCESS MSG
}
}
int XSocket::irecv(char * data, int size)
{
int inlen, ret;
inlen= 0;
while (inlen< size) {
ret= recv(m_Sock, (data+ inlen), size - inlen, 0);
if (ret< 0) {
return -1;
}
else if (ret== 0) {
return 0;
}
else {
inlen+= ret;
}
}
return inlen;
}
im解决了这个问题!!,im将epoll从边缘触发改为水平触发,并解决了!
相关文章:
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 发送和十六进制消息时套接字代码C++问题
- 通过套接字发送整数数组时出现问题
- 此函数是否对套接字有问题?
- 一些简单的套接字问题供C++
- 套接字 TCP 服务器程序问题
- poll()套接字编程tcp-linux多连接问题
- 通过套接字发送HBITMAP出现问题
- 通过套接字发送的图像流-服务器死锁问题
- 套接字和telnet出现问题
- Android NDK套接字连接问题
- 包含互斥对象C++时出现套接字问题
- 在 Linux 计算机中使用套接字发送和接收文件时C++问题
- C++套接字连接问题
- 发送/接收套接字阻塞问题
- 比较套接字地址的问题
- 套接字c++,接收信息的奇怪问题
- 提升 unix 上的 UDP 套接字问题 - 绑定:地址已在使用中
- Qt套接字问题
- 发送数据时出现套接字问题