LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 920|回复: 4

socket编程时遇到的问题!看代码...

[复制链接]
发表于 2006-10-12 17:32:03 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <errno.h>

int main(void) {
   int sockfd;

   sigset_t set, oldset;
   sigemptyset(&set);
   sigaddset(&set, SIGPIPE);
   sigprocmask(SIG_SETMASK, &set, &oldset);

   if( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
      perror("socket");
      exit(1);
   }

   struct in_addr addr;
   if(inet_aton("127.0.0.1", &addr) == 0) {
      perror("inet_aton");
      exit(1);
   }

   struct sockaddr_in saddr;
   saddr.sin_family = AF_INET;
   saddr.sin_addr = addr;
   saddr.sin_port = htons(80);

   if ( connect(sockfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr)) < 0) {
      perror("connect");
      exit(1);
   }

   char buffer[] = "GET /index.html HTTP\\1.1\r\n\r\n";
   send(sockfd, buffer, sizeof(buffer), 0);

   FILE *rfp;
   if( !(rfp = fdopen(sockfd, "r"))) {
      perror("fdopen");
      exit(1);
   }

   if( setvbuf(rfp, NULL, _IONBF, 0) != 0) {
      perror("setvbuf");
      exit(1);
   }


   char *rbuff = NULL;
   int rsize = 0, stat;
   while(1) {
      stat = getline(&rbuff, &rsize, rfp);
      if(stat == -1) {
         perror("getline");
         break;
      }
      printf("%s\n", rbuff);

      free(rbuff);
      rbuff = NULL;
      rsize = 0;
   } /* Now the remote server is closed. */

   /* Send data to remote server, but no error had occured. why??????? */
   char buffer2[] = "GET /index.html HTTP\\1.1 \r\n\r\n";
   int s = send(sockfd, buffer2, sizeof(buffer2), 0);
   if(s == -1) {
      perror("send");
      exit(1);
   }

   /* The application is still going on, and execute the follow codes.
    * But the result is 0, so remote server is closed. why?? */
   char rbuffer2[40];
   int s2 = recv(sockfd, rbuffer2, sizeof(rbuffer2), MSG_WAITALL);
   printf("%d\n", s2);

   exit(0);
}


为什么在远端主机已经关闭的情况下, 客户端还能继续向发送数据, 而且还发送成功, 按照道理来讲应该是返回EPIPE才对的啊, 下一步读取的时候也是返回的0哪就证明远端已经关闭!
难道远程服务器仅仅只是关闭了读而没有关闭写??? 请高人提示一下。。。。

以上测试是通过连接http服务器来的。。
发表于 2006-10-12 23:24:01 | 显示全部楼层
需要理解一下TCP的写操作:

写成功并不表示数据已经发送到对等方,只是把数据放到发送缓冲区中而已。实际上,当写操作返回时,写入的部分或全部数据可能仍旧在排队等待传输。

此外,因为写操作可能在数据实际发送之前就已经返回,所以当传输发生错误时,该错误通常是从下一个操作返回。
回复 支持 反对

使用道具 举报

发表于 2006-10-13 16:44:37 | 显示全部楼层
/* Send data to remote server, but no error had occured. why??????? */
char buffer2[] = "GET /index.html HTTP\\1.1 \r\n\r\n";
int s = send(sockfd, buffer2, sizeof(buffer2), 0);
if(s == -1) {
perror("send");
exit(1);
}

我想事实上数据并没有发出的, send返回的是0吧,代表一个字节也没有发出。
send返回0和recv返回0的意思是一样的吧,都代表对方关闭了连接了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-13 17:32:57 | 显示全部楼层
对于PIPE而言  如果没有读端 发送数据的时候将会发生EPIPE错误。
通过实际测试上面的程序在连接关闭后发送数据确实成功了也没返回错误!

这个就是我的疑惑所在...
回复 支持 反对

使用道具 举报

发表于 2006-10-15 14:54:12 | 显示全部楼层
PF_INET? AF_INET ?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表