Chinaunix

标题: 我用socket编程read的时候出的问题 [打印本页]

作者: CnkknD    时间: 2003-08-04 19:44
标题: 我用socket编程read的时候出的问题
我想读出所有的信息,可是一直失去相应
  1. void snr(int sockfd,char *cmd,char buf[])
  2. {
  3.         int len;
  4.         int tmp;
  5.         char *p;
  6.         char b[1024];
  7.         p=buf;
  8.         len=strlen(cmd);
  9.         send(sockfd,cmd,len,0);
  10.         len=0;
  11.         while(tmp=recv(sockfd,b,1,0))
  12.         //while()
  13.         //tmp=recv(sockfd,b,1024,0);
  14.         {
  15.                 printf("%d",tmp);
  16.                 puts(b);
  17.                 len+=tmp;
  18.                 strcpy(p,b);
  19.                 p=&buf[len];
  20.         }
  21.         buf[len]='\0';
  22. }
复制代码

我一个字符一个字符的读,到没有信息的时候recv就没有响应了,而根本就不会给tmp赋值,而且b即不是NULL,也不是EOF,我怎么才能把所有的信息全部读出来呢?
作者: 蓝色键盘    时间: 2003-08-04 21:01
标题: 我用socket编程read的时候出的问题
老大,你需要知道长度或者有个措施知道什么时候结束,因为tcp是没有边界的有序字符流。

你这样的话,除非对方close了描述字,或者socket发生了错误,或者被信号中断,或者对方进程异常等。才能让recv返回。

在这个过程中,你可以设置超时,或者干脆用select。
作者: CnkknD    时间: 2003-08-04 21:06
标题: 我用socket编程read的时候出的问题
我开始是用php编写的,遇到的情况和这个一样,但为什么好多书上的例子都是while(!feof(..))就可以了呢?
比如我用php获取一个ftp所有文件信息
  1. $fp=fopen($this->;server.".".$this->;port,'a');
  2. $i=0;
  3. while (!feof($sock_data)) {
  4.         $list[$i++] = ereg_replace("[\r\n]", "", fgets($sock_data, 512));
  5.         if($i==100){
  6.                 fputs($fp,implode("\n", $list));
  7.                 $i=0;
  8.         }
  9. }
  10. fclose($fp);
复制代码

这个程序执行就没有问题
作者: CnkknD    时间: 2003-08-04 21:34
标题: 我用socket编程read的时候出的问题
谢谢,我用select搞掟了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2