|
|
#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服务器来的。。 |
|