zoukankan      html  css  js  c++  java
  • linux c select函数使用求解释

          代码非常easy,就是发送c语言发送http请求。但 i= read(sockfd, buf, BUFSIZE-1); 能够正常执行, 

    替换为i= Read(sockfd, buf, BUFSIZE-1);后程序退出,不知什么原因,求解答。


    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <time.h>
    #include <errno.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/time.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
     
    #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 timeval  tv;
     
            if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
                    printf("---socket error!
    ");
                    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!
    ");
                    exit(0);
            };
     
            if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
                    printf("connect error!
    ");
                    exit(0);
            }
    
            memset(str1, 0, 4096);
            strcat(str1, "GET / HTTP/1.1
    ");
            strcat(str1, "Host: www.baidu.com
    ");
            strcat(str1, "
    
    ");
            printf("%s",str1);
     
            ret = write(sockfd,str1,strlen(str1));
            if (ret < 0) {
    		printf("errno = %d strerror = %s
    ",errno, strerror(errno));
                    exit(0);
            }else{
    		printf("send %d size
    ", ret);
            }
     
            FD_ZERO(&t_set1);
            FD_SET(sockfd, &t_set1);
     
            while(1){
                    tv.tv_sec= 2;
                    tv.tv_usec= 0;
                    h= 0;
                    printf("--------------->1
    ");
                    h= select(sockfd +1, &t_set1, NULL, NULL, &tv);
                    printf("--------------->2
    ");
     
    		printf("h =================== %d
    ", h);
                    //if (h == 0) continue;
                    if (h < 0) {
                            close(sockfd);
    			printf("select error 
    ");
                            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 .................
    ");
                                    return -1;
                            }
                            printf("%s
    ", buf);
                    }
            }
            close(sockfd);
            return 0;
    }


    
                    
  • 相关阅读:
    MYSQL数据库间同步数据
    mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法
    Apache优化:修改最大并发连接数
    MySql 存储过程实例(附完整注释)
    android loadlibrary 更改libPath 路径,指定路径加载.so
    如何在ANDROID JNI 的C++中打Log
    递归转手工栈处理的一般式[C语言]
    计算机语言学习导论[C/C++]
    程序错误[C/C++]
    访问栈为什么会比访问堆快?
  • 原文地址:https://www.cnblogs.com/llguanli/p/8931400.html
Copyright © 2011-2022 走看看