<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">本次记录网络编程。</span>
使用的通信协议为TCP,方式为epoll方式。对于socket的基本知识不再记录,这里直接给出说明代码。
在进行网络编程时遇到一个问题,还不知道原因,函数代码如下:
int read_pack(int sockfd,void * buf,int len)
{
if(buf==NULL||len<=0)
return 0;
int nleft;
int nread, nwrite;
char *ptr;
long int offset = 0;
ptr=(char *)buf;
nleft = len;
printf("nleft is :%d\n", nleft);
while(nleft > 0)
{
printf("nleft is :%d\n", nleft);
if((nread = recv(sockfd, &ptr[offset], nleft, 0)) < 0)//read返回错误
{
printf("Read ERROR\n");
if(errno == EINTR)//是由于信号中断造成的读失败,则继续读
nread = 0;
else//否则是真正的读错误,返回失败的标志
return -1;
}
else if(nread == 0)//数据读取完毕了,到达了文件的末尾
break;
nleft -= nread;//剩余要读取的
offset += nread;//偏移缓冲区位置
printf("nread is :%d\n", nread);
/*if((nwrite = send(sockfd, "Next", 4, 0)) < 0)
{
printf("ERROR\n");
break;
}*/
}
printf("nleft is :%d\n", nleft);
printf("Read over\n");
return (len-nleft);
}
问题就是上面的recv读函数,假如数据已经读完了,但是还未判断nread的值所以还不能跳出循环,于是又读了一次,因为已经读完数据,所以这次读数据返回的nread值应该是0,可是实际上是,读的时候死在那里了。
多方面思考我想是不是recv函数在等待服务端发送的数据,阻塞在那里了。不太明白,还需要跟踪一下源码。
但是如果在服务端指定了文件的大小,而且客户端也已经知道要接收的文件大小的话,就没有问题了。
因此我想服务端在发送具体文件数据前,先通知客户端,下面将要发送文件的大小信息,于是定义一个下面的结构体:
typedef struct{
char file_name;//文件名字
long int file_size;//文件的大小
long int complete_block;//记录file_name该文件已经传送完成的数据
}file_info;
用上面这个结构体来标示文件的相关信息。
测试调试一下。