• 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;
    }


    
                    
  • 相关阅读:
    原生,js,自执行函数的三种写法,及特性
    js延迟加载的六种方式
    antd table 合并行的方法
    css 常用样式antd design 中table,表格省略号处理的问题
    axios 中文文档
    js ,几张遍历,循环的方法
    javascript怎么保留两位小数
    Category(十九)
    Protocol(协议)(二十)
    Extension延展(十八)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8931400.html
Copyright © 2020-2023  润新知