免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: timepie
打印 上一主题 下一主题

[C] socket传输数据 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-11-14 13:37 |只看该作者
如果不传递大小,用select阻塞接受进程可以吗

  1. while(retval = select(0, &readFD, NULL, &exceptFD, &timeout))
  2. {
  3. if (retval == 0) goto cleanup;//超时
  4. if FD_ISSET(&exceptFD,u_socket) goto cleanup;//链接中断
  5. if FD_ISSET(&readFD,u_socket) recv...;
  6. }
复制代码

论坛徽章:
0
32 [报告]
发表于 2007-11-14 15:05 |只看该作者
肯定要先传大小。否则,网络环境这么复杂,我怎么知道你是正常传输完毕,还是出错结束了?

论坛徽章:
0
33 [报告]
发表于 2007-11-15 12:54 |只看该作者
制定协议和传文件大小是其中的一部分!
不过关键是检查传输过程中出现的错误和检查send的代码是否正确!

send的时候注意处理最后一个buf的长度,传的长度是实际的长度!
比如buffer size = 512
而你的文件是513字节的,
则第一次send是512字节,第二次是1字节!



  1.                 ret = select( recv_sockfd + 1, &fd_recv, NULL, NULL, &tm );

  2.                 if ( ( ret == -1 ) && ( errno == EINTR ) ) {  /* interrupted by signal */
  3.                         continue;
  4.                 } else if ( ret == -1 ) {                     /* real select error */
  5.                         break;
  6.                 } else if ( ret == 0 ) {                      /* timeout */
  7.                         continue;
  8.                 }
复制代码

  1.                         ret = select( send_sockfd + 1, NULL, &fd_send, NULL, &tm );

  2.                         if ( ( ret == -1 ) && ( errno == EINTR ) ) {  /* interrupted by signal */
  3.                                 continue;
  4.                         } else if ( ret == -1 ) {                     /* real select error */
  5.                                 break;
  6.                         } else if ( ret == 0 ) {                      /* timeout */
  7.                                 continue;
  8.                         }
复制代码

论坛徽章:
10
CU大牛徽章
日期:2013-09-18 15:20:48程序设计版块每日发帖之星
日期:2016-07-21 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:01技术图书徽章
日期:2014-10-14 16:00:43天蝎座
日期:2013-09-27 17:41:29CU大牛徽章
日期:2013-09-18 15:21:17CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:20:58每日论坛发贴之星
日期:2016-07-21 06:20:00
34 [报告]
发表于 2007-11-15 17:03 |只看该作者
传输方的程序是怎么写的?
运行环境呢?
fopen(file,"rb")
fopen(file,"rt")
这里面可能会有 \r\n的转换

论坛徽章:
0
35 [报告]
发表于 2007-11-15 17:10 |只看该作者

论坛徽章:
0
36 [报告]
发表于 2007-11-16 16:43 |只看该作者
这个和FTP 客户端的对话,关于传送数据出错解决了……

是我在服务端忘记了解析“TYPE”这个命令,如果解析这个命令的话,按照原来的方法传输就会很正常。

-.-谢谢大家,偶学到不少的东西~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP