设为首页 加入收藏

TOP

Linux C语言Select函数使用求解释
2015-07-16 12:56:06 来源: 作者: 【 】 浏览:3
Tags:Linux 语言 Select 函数 使用 解释

代码很简单,就是发送C语言发送http请求,但 i= read(sockfd, buf, BUFSIZE-1); 可以正常运行,替换为i= Read(sockfd, buf, BUFSIZE-1);后程序退出,不知什么原因,求解答。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
?
#define IPSTR "180.97.33.107"
#define PORT 80
#define BUFSIZE 1024 * 1024 * 2


int Read(int fd, char *buf, int count) {
? ? int nread, totlen = 0;


? ? while (totlen != count) {
? ? ? ? nread = read(fd, buf, count - totlen);
? ? ? ? if (nread == 0)
? ? ? ? ? ? return totlen;
? ? ? ? if (nread == -1)
? ? ? ? ? ? return -1;
? ? ? ? totlen += nread;
? ? ? ? buf += nread;
? ? }?
? ? return totlen;
}


?
int main(int argc, char **argv)
{
? ? ? ? int sockfd, ret, i, h;
? ? ? ? struct sockaddr_in servaddr;
? ? ? ? char str1[4096], buf[BUFSIZE];
? ? ? ? socklen_t len;
? ? ? ? fd_set? t_set1;
? ? ? ? struct timeva l? tv;
?
? ? ? ? if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
? ? ? ? ? ? ? ? printf("---socket error!\n");
? ? ? ? ? ? ? ? exit(0);
? ? ? ? };
?
? ? ? ? bzero(&servaddr, sizeof(servaddr));
? ? ? ? servaddr.sin_family = AF_INET;
? ? ? ? servaddr.sin_port = htons(PORT);
? ? ? ? if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){
? ? ? ? ? ? ? ? printf("--inet_pton error!\n");
? ? ? ? ? ? ? ? exit(0);
? ? ? ? };
?
? ? ? ? if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
? ? ? ? ? ? ? ? printf("connect error!\n");
? ? ? ? ? ? ? ? exit(0);
? ? ? ? }


? ? ? ? memset(str1, 0, 4096);
? ? ? ? strcat(str1, "GET / HTTP/1.1\n");
? ? ? ? strcat(str1, "Host: www.baidu.com\n");
? ? ? ? strcat(str1, "\n\n");
? ? ? ? printf("%s",str1);
?
? ? ? ? ret = write(sockfd,str1,strlen(str1));
? ? ? ? if (ret < 0) {
? printf("errno = %d strerror = %s\n",errno, strerror(errno));
? ? ? ? ? ? ? ? exit(0);
? ? ? ? }else{
? printf("send %d size\n", ret);
? ? ? ? }
?
? ? ? ? FD_ZERO(&t_set1);
? ? ? ? FD_SET(sockfd, &t_set1);
?
? ? ? ? while(1){
? ? ? ? ? ? ? ? tv.tv_sec= 2;
? ? ? ? ? ? ? ? tv.tv_usec= 0;
? ? ? ? ? ? ? ? h= 0;
? ? ? ? ? ? ? ? printf("--------------->1\n");
? ? ? ? ? ? ? ? h= select(sockfd +1, &t_set1, NULL, NULL, &tv);
? ? ? ? ? ? ? ? printf("--------------->2\n");
?
? printf("h =================== %d\n", h);
? ? ? ? ? ? ? ? //if (h == 0) continue;
? ? ? ? ? ? ? ? if (h < 0) {
? ? ? ? ? ? ? ? ? ? ? ? close(sockfd);
? ?printf("select error \n");
? ? ? ? ? ? ? ? ? ? ? ? return -1;
? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? if (h > 0){
? ? ? ? ? ? ? ? ? ? ? ? memset(buf, 0, BUFSIZE);
? ? ? ? ? ? ? ? ? ? ? ? i= read(sockfd, buf, BUFSIZE-1);
? ? ? ? ? ? ? ? ? ? ? ? //i= Read(sockfd, buf, BUFSIZE-1);
? ?printf("i ========================== %d", i);
? ? ? ? ? ? ? ? ? ? ? ? if (i==0){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? close(sockfd);
? ? printf("stop .................\n");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -1;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? printf("%s\n", buf);
? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ? close(sockfd);
? ? ? ? return 0;
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ 能否成为你新的脚本语言? 下一篇Linux下echo与time服务的程序实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: