recv java_recv()阻止第二次调用

我有一个简单的客户端 - 服务器应用程序,用于从客户端发送文件到服客户端以预定义大小的块(例如512)发送文件 . 服务器也以相同大小的块接收文件 . 在服务器收到整个文件后发送确认之前,客户端上的套接字不会关闭 .

会发生什么:

客户端设法发送(send()调用)整个文件,意味着它的所有块 .

服务器设法获取(recv()调用)只有第一个块,意味着recv()调用在第一次调用时返回512,在第二次调用时它被阻塞 .

这种行为可能是什么原因?

以下是相关部分 .

发送\接收功能:

int sendBuf(int sockFd, char* buf, int size){

int bytesSent = 0;

while (bytesSent < size){

bytesSent += send(sockFd, buf, size, 0);

}

return bytesSent;

}

int sendInt(int sockFd, int num){

uint32_t nbo_num = htonl(num);

return sendBuf(sockFd, (char*)&nbo_num, sizeof(nbo_num));

}

int getBuf(int sockFd, char* buf, int size){

int bytesRecv = 0;

while (bytesRecv < size){

bytesRecv += recv(sockFd, buf, size, 0);

}

return bytesRecv;

}

int getInt(int sockFd, int *num){

int temp, bytesRecv;

bytesRecv = getBuf(sockFd, (char*)&temp, sizeof(int));

*num = ntohl(temp);

return bytesRecv;

}

服务器:

printf("%s New file was created.\n",tStr);

/* get file data */

char buf[FILE_READ_CHUNK_SIZE] = {0}; // FILE_READ_CHUNK_SIZE is the maximal read amount

int bytesWritten = 0, bytesLeft = fileSize, _size=0, chunkNo=0;

bytesRecv = 0;

while (bytesLeft > 0){

_size = (bytesLeft > FILE_READ_CHUNK_SIZE) ? FILE_READ_CHUNK_SIZE : bytesLeft;

bytesRecv = getBuf(newsockfd, buf, _size);

int _bytesLeft = bytesRecv;

bytesWritten = 0;

while (_bytesLeft > 0){

bytesWritten = fileInfoWrite(fileInfo, buf, _bytesLeft);

_bytesLeft -= bytesWritten;

}

chunkNo++;

printf("%s chunk #%d: received %d bytes\n",tStr , chunkNo, bytesRecv);

bytesLeft -= bytesRecv;

}

printf("%s Finished getting file #%d.\n",tStr ,i+1);

/* send ack to the client */

bytesSent = sendInt(newsockfd, 1);

printf("%s Sent the client an ack for file #%d.\n",tStr ,i+1);

客户:

/* send the entire data of the file */

printf(" Sending file data\t\t... ");

char buf[FILE_READ_CHUNK_SIZE] = {0}; // FILE_READ_CHUNK_SIZE is the maximal read amount

int numOfChunks=0, bytesRead = 0, bytesLeft = filesArr[i]->fileSize ;

bool eof = false;

bytesSent = 1;

while (bytesLeft > 0){

bytesRead = fileInfoRead(filesArr[i], buf, &eof);

int _bytesLeft = bytesRead;

while (bytesSent < _bytesLeft){

bytesSent = sendBuf(sockFd, buf, _bytesLeft);

_bytesLeft -= bytesSent;

}

//printf(" chunk #%d: sent %d bytes\n", numOfChunks+1, bytesRead);

bytesLeft -= bytesRead;

numOfChunks++;

}

printf("Success.\n");

/* get ack from server */

int ack=0;

bytesRecv = getInt(sockFd, &ack);

if (bytesRecv!=4 || ack!=1){

printf("Server ack is invalid.\n");

}

printf("Finished sending file #%d.\n",i+1);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值