免费注册 查看新帖 |

Chinaunix

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

[C] 求解一造成银行1000W损失的C语言”write“函数问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-12-13 09:36 |只看该作者
回复 8# yjh777


    不好意思 补充一下 AIX平台下,基于TCP/IP的socket。与同一台机器上的JAVA程序通讯。其实本应该使用send函数来发数据的,但现在出现了这个问题,客户需要找到出现问题的原因。

论坛徽章:
0
12 [报告]
发表于 2010-12-13 09:38 |只看该作者
回复 10# flw


    write出错当然要判断,现在就是出错了,程序认为这笔业务是失败的,但write该出错吗?其实就是程序的错误。现在正寻求解决此程序错误的方法。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
13 [报告]
发表于 2010-12-13 09:54 |只看该作者
回复  flw


    write出错当然要判断,现在就是出错了,程序认为这笔业务是失败的,但write该出错吗? ...
haoxifer 发表于 2010-12-13 09:38



    缓冲区满了就写不进了呀,要循环写

论坛徽章:
0
14 [报告]
发表于 2010-12-13 09:57 |只看该作者
回复 13# hellioncu


    这话说的对,但我现在就是要知道缓冲区的大小啊。。。 不知道大小 怎么写 我写1024 它缓冲区设成1023不还是挂。。。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
15 [报告]
发表于 2010-12-13 10:06 |只看该作者
回复  hellioncu


    这话说的对,但我现在就是要知道缓冲区的大小啊。。。 不知道大小 怎么写 我写1 ...
haoxifer 发表于 2010-12-13 09:57



    若write返回(非-1)小于你要写的字节,你就再次write写后面剩下的字节,直至写完或者返回-1

论坛徽章:
0
16 [报告]
发表于 2010-12-13 10:19 |只看该作者
回复 15# hellioncu


    您说这种做法刚好跟我当前的程序吻合,但现在的问题是,如果我指定的写入大小超过了8192它并不给我返回实际写入的大小,而是返回了-1,一个字节都写不进去的

论坛徽章:
0
17 [报告]
发表于 2010-12-13 10:31 |只看该作者
回复 11# haoxifer
贴上代码,大家帮忙看看代码是否存在问题呢?谢谢各位了~!
  1. int socket_send(int socket_fd, const char *send_data, int send_len){
  2.         int once_write,offset;
  3.        
  4.         if(socket_fd < 0)
  5.         {
  6.                 printf("Invalid socket[%d]! -- [%s][socket_send][%d]\n",socket_fd,__FILE__,__LINE__);
  7.                 sprintf(comm_err_msg,"Invalid socket[%d]! -- [%s][socket_send][%d]\n",socket_fd,__FILE__,__LINE__);
  8.                 return FAILED;
  9.         }
  10.        
  11.         if(send_len <= 0)
  12.         {
  13.                 printf("Invalid send length[%d]! -- [%s][socket_send][%d]\n",send_len,__FILE__,__LINE__);
  14.                 sprintf(comm_err_msg,"Invalid send length[%d]! -- [%s][socket_send][%d]\n",send_len,__FILE__,__LINE__);
  15.                 return FAILED;
  16.         }

  17.         #ifdef DEBUG
  18.                 printf("Send data [%s], Send len [%d]\n", send_data, send_len);
  19.         #endif
  20.        
  21.         /*对于流式套接字,write方法返回实际发送得字节数,可能会小于待发送得总字节数*/
  22.         offset=0;
  23.         while(offset < send_len)
  24.         {
  25.                 once_write=write(socket_fd, send_data + offset, send_len - offset);
  26.                 if(once_write <= 0)
  27.                 {
  28.                         printf("socket write error! has write length[%d]! -- %s[%s][socket_send][%d]\n",offset,strerror(errno),__FILE__,__LINE__);
  29.                         sprintf(comm_err_msg,"socket write error! has write length[%d]! -- %s[%s][socket_send][%d]\n",offset,strerror(errno),__FILE__,__LINE__);
  30.                         return FAILED;
  31.                 }
  32.                 offset += once_write;
  33.         }
  34.        
  35.         return send_len;       
  36. }
复制代码

论坛徽章:
0
18 [报告]
发表于 2010-12-13 10:58 |只看该作者
回复 17# haoxifer
你没有错误处理?还是没贴出来

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
19 [报告]
发表于 2010-12-13 11:04 |只看该作者
回复  haoxifer
贴上代码,大家帮忙看看代码是否存在问题呢?谢谢各位了~!
haoxifer 发表于 2010-12-13 10:31



    返回0不应该算错,-1才算。
另外errno会被前面的printf所改变,要多次使用errno,应该先存到一个局部变量中

论坛徽章:
0
20 [报告]
发表于 2010-12-13 12:46 |只看该作者
回复 18# greensnow


    这里只贴了一个发送函数,错误就返回-1了,调用它的代码没发了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP