BBS水木清华站∶精华区

发信人: sophie (心静如水), 信区: Unix        
标  题: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 08:38:04 2000) 
 
【 以下文字转载自 Winsock 讨论区 】 
【 原文由 sophie 所发表 】 
     有没有人用send(),recv()函数遇上过通信一方 
实际接收到的数据个数少于另一方发送出的数据个数 
这种情形?是不是除了分段发送和接收,别无它法? 
    谢了先! 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.114.1.206] 
发信人: mafie (浪人~空手进三月,offer抵万金), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 08:51:26 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
 【 以下文字转载自 Winsock 讨论区 】 
 【 原文由 sophie 所发表 】 
      有没有人用send(),recv()函数遇上过通信一方 
 实际接收到的数据个数少于另一方发送出的数据个数 
 这种情形?是不是除了分段发送和接收,别无它法? 
     谢了先! 
 
如果是TCP socket,send和recv正常返回的话, 
不会出现这个问题的。 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: sap1.cs.tsinghu] 
发信人: sophie (心静如水), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 09:00:27 2000) 
 
   是TCP socket, 我以前也试过可以正常返回,但现在 
我的server端加入了pvm的内容,启动了pvm进程,就出现 
这个问题了:我试着从客户端接收200个double数,但总是 
只收到182个,my God, why?害得我现在只能每次发送不 
超过182个,分段才能正常接收. 
    我的天,哪以后我要传送更多的数据可如何是好? 
【 在 mafie (浪人~空手进三月,offer抵万金) 的大作中提到: 】 
 如果是TCP socket,send和recv正常返回的话, 
 不会出现这个问题的。 
 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.114.1.206] 
发信人: mafie (浪人~空手进三月,offer抵万金), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 09:05:27 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
    是TCP socket, 我以前也试过可以正常返回,但现在 
 我的server端加入了pvm的内容,启动了pvm进程,就出现 
 这个问题了:我试着从客户端接收200个double数,但总是 
 只收到182个,my God, why?害得我现在只能每次发送不 
 超过182个,分段才能正常接收. 
     我的天,哪以后我要传送更多的数据可如何是好? 
收到182个之后socket的状态是什么? 
 
pvm进程是否可以读取socket的数据,导致不正常? 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: coco.cic.tsingh] 
发信人: railan (雨天 - offer container), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 10:15:59 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
    是TCP socket, 我以前也试过可以正常返回,但现在 
 我的server端加入了pvm的内容,启动了pvm进程,就出现 
 这个问题了:我试着从客户端接收200个double数,但总是 
 只收到182个,my God, why?害得我现在只能每次发送不 
 超过182个,分段才能正常接收. 
再用recv收一次就可以了,200个double可能是放在两个IP包中发送的. 
     我的天,哪以后我要传送更多的数据可如何是好? 
典型的方法有两个: 
1.发送数据之前先发送一个长度域,接收方根据该长度进行接收. 
2.象FTP那样另开一个数据连接,数据传送结束后关闭该连接. 
 
-- 
  / / / / / / / / / / / / / /  
/ / / / / / /大头大头 / / / / / 
/ / / / / / 下雨不愁/ / / / / / 
/ / / / / /人家有伞 / / / / / / 
  / / / / 我有大头/ / / / / /  
    / / / / / / / / / / / /  
 
※ 修改:·railan 於 Mar  8 10:20:09 修改本文·[FROM: ns.net.tsinghua] 
※ 修改:·railan 於 Mar  8 10:29:19 修改本文·[FROM: ns.net.tsinghua] 
※ 来源:·BBS 水木清华站 smth.org·[FROM: ns.net.tsinghua] 
发信人: sophie (心静如水), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 10:50:56 2000) 
 
【 在 railan (雨天 - offer container) 的大作中提到: 】 
 再用recv收一次就可以了,200个double可能是放在两个IP包中发送的. 
 典型的方法有两个: 
 1.发送数据之前先发送一个长度域,接收方根据该长度进行接收. 
     哦,我正是这样做的呀?先收到长度值n,然后 
    recv(,,n*sizeof(double),0)可是... 
 
 2.象FTP那样另开一个数据连接,数据传送结束后关闭该连接. 
 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.114.1.206] 
发信人: djq (djq), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 11:33:56 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
      哦,我正是这样做的呀?先收到长度值n,然后 
     recv(,,n*sizeof(double),0)可是... 
这个不保证你一定能接受到n个double的. 
 
 
-- 
 
  --  Whip me. Beat me. Make me install Oracle.  -- 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.136.159] 
发信人: netspider (阿军), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 11:52:48 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
      哦,我正是这样做的呀?先收到长度值n,然后 
     recv(,,n*sizeof(double),0)可是... 
 
you should use recv(fd, ptr, n, MSG_WAITALL); 
 
如果系统不支持这个MSG_WAITALL, 我看你还是用那个最土的readn(), 比较好。 
 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 159.226.41.166] 
发信人: netspider (阿军), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 11:54:39 2000) 
 
【 在 netspider (阿军) 的大作中提到: 】 
 you should use recv(fd, ptr, n, MSG_WAITALL); 
 如果系统不支持这个MSG_WAITALL, 我看你还是用那个最土的readn(), 比较好。 
 
AIX4.1以上支持这个option, you can find it in sys/socket.h 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 159.226.41.166] 
发信人: sophie (心静如水), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 17:06:49 2000) 
 
【 在 mafie (浪人~空手进三月,offer抵万金) 的大作中提到: 】 
 如果是TCP socket,send和recv正常返回的话, 
 不会出现这个问题的。 
      我已检验过了,send recv返回的参数都正常. 
   我偶然将server端的recv()以后的语句删掉后, 
 (recv()之后是一段计算程序,然后将计算结果send给client) 
 发现recv收到的数据就符合client端发送出的数据个数了. 
 现在当server收到这批数据后,若增加一段语句,回 
 送反馈信息,就不会再有问题了,奇怪! 
     当我将调通的程序发送接收段增加while{}原样 
 循环执行两次,第二次执行开始时就出现问题,server端 
 显示read error.奇怪! 
     send() & recv() 之间有什么关系?有些什么约束? 
  
 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.114.1.206] 
发信人: netspider (阿军), 信区: Unix        
标  题: Re: help for unix socket (转载) 
发信站: BBS 水木清华站 (Wed Mar  8 18:36:26 2000) 
 
【 在 sophie (心静如水) 的大作中提到: 】 
       我已检验过了,send recv返回的参数都正常. 
    我偶然将server端的recv()以后的语句删掉后, 
  (recv()之后是一段计算程序,然后将计算结果send给client) 
  发现recv收到的数据就符合client端发送出的数据个数了. 
  现在当server收到这批数据后,若增加一段语句,回 
  送反馈信息,就不会再有问题了,奇怪! 
      当我将调通的程序发送接收段增加while{}原样 
  循环执行两次,第二次执行开始时就出现问题,server端 
  显示read error.奇怪! 
      send() & recv() 之间有什么关系?有些什么约束? 
 
看不懂的说,你将代码贴上来吧。 
 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 159.226.41.129] 

BBS水木清华站∶精华区