当前位置: 技术问答>linux和unix
关于socket select通信,为什么这样?
来源: 互联网 发布时间:2016-07-15
本文导语: 这个到底是什么原因呢? 运行服务器端读取文件发给客户端,然后运行客户端,客户端接收数据创建文件保存数据,但是客户端这边创建的文件里面老有乱码,很多东西都不正常。但是把客户端给关掉,服务器端保...
这个到底是什么原因呢?
运行服务器端读取文件发给客户端,然后运行客户端,客户端接收数据创建文件保存数据,但是客户端这边创建的文件里面老有乱码,很多东西都不正常。但是把客户端给关掉,服务器端保持运行,然后再打开客户端,就正常了。
只要服务器端不关,客户端随便关掉或者运行,都是第一次出现问题,以后就一直是好的了。到底什么原因呢?
运行服务器端读取文件发给客户端,然后运行客户端,客户端接收数据创建文件保存数据,但是客户端这边创建的文件里面老有乱码,很多东西都不正常。但是把客户端给关掉,服务器端保持运行,然后再打开客户端,就正常了。
只要服务器端不关,客户端随便关掉或者运行,都是第一次出现问题,以后就一直是好的了。到底什么原因呢?
|
知道为什么么?
你对字符串还不是完全了解。一个buffer里装这许多字符,并不代表他是字符串。因为字符串有一个标示''。
假如有下面两个buffer.按10个字节举例。
buffer1:
1234567890
buffer2:
123456789'' //''这是一个字节。
buffer1里面虽然都是字符,但它不能叫做字符串,所以也不能使用strxxxx()函数来操作,带来的后果是不可预测的,有时可能对,有时可能错,而且错的很离谱。因为buffer1以外的空间,哪里是''谁也不知道。
此外,buffer2的空间是10字节,但他的字符串是9。strlen()=9。这些地方要注意。
你对字符串还不是完全了解。一个buffer里装这许多字符,并不代表他是字符串。因为字符串有一个标示''。
假如有下面两个buffer.按10个字节举例。
buffer1:
1234567890
buffer2:
123456789'' //''这是一个字节。
buffer1里面虽然都是字符,但它不能叫做字符串,所以也不能使用strxxxx()函数来操作,带来的后果是不可预测的,有时可能对,有时可能错,而且错的很离谱。因为buffer1以外的空间,哪里是''谁也不知道。
此外,buffer2的空间是10字节,但他的字符串是9。strlen()=9。这些地方要注意。
|
早就跟你说过用来select。用一个的话也行,但是得打标记
|
好几天没上来了。怎么又是你。
|
判断一个buffer为不为零,效率很低。基本上就是一个字节一个字节的比较。
你可以定义一个变量,buf清空的时候,把变量顺便赋成 1 ,buf写的时候,再把变量赋成 0 ,这样就可以判断变量来判断buffer了。
但总感觉你的buffer好像不用这么操作。
Ready!啊,有创意。万一你文章里也有Ready!怎么办?
你可以定义一个变量,buf清空的时候,把变量顺便赋成 1 ,buf写的时候,再把变量赋成 0 ,这样就可以判断变量来判断buffer了。
但总感觉你的buffer好像不用这么操作。
Ready!啊,有创意。万一你文章里也有Ready!怎么办?
|
先标记下,晚上有时间看看
小伙很努力。呵呵
小伙很努力。呵呵
|
我想问下,你客户端接收到的文件内是不是有文件空洞(asc码等于0的字符)?
客户端是不是可以去掉 FD_SET(sockfd,&writefds); ,因为看到客户端并没有发送数据。
然后设置一个标志变量,接收到数据flag = true; 往文件内写数据的时候判断flag,如果为真,写入文件,并将flag = false。
客户端是不是可以去掉 FD_SET(sockfd,&writefds); ,因为看到客户端并没有发送数据。
然后设置一个标志变量,接收到数据flag = true; 往文件内写数据的时候判断flag,如果为真,写入文件,并将flag = false。
|
因为第二次循环的时候,有可能没有收到数据,但是写描述符集总是为真,导致写入如下的buf
写入文件。
memset(buf,0,12024);
fwrite(buf,len,1,fp);
那么写入了1024个文件空洞
而且接收数据的时候,你的select可以设置的长点,如果超时,就当成服务器端dump了,文件接收失败,程序退出。
写入文件。
memset(buf,0,12024);
fwrite(buf,len,1,fp);
那么写入了1024个文件空洞
而且接收数据的时候,你的select可以设置的长点,如果超时,就当成服务器端dump了,文件接收失败,程序退出。