道滘仿做网站,线上ui设计培训哪个好,安丘网站制作,上海最新新闻发布会在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起.但是,如果尝试使用linux GET命令连接到应用程序的http服务器,则我将成功连接到http服务器.据我对谷歌搜索的了解,我发现这不是正确的方法.但是…在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起.但是,如果尝试使用linux GET命令连接到应用程序的http服务器,则我将成功连接到http服务器.据我对谷歌搜索的了解,我发现这不是正确的方法.但是,如果要执行此操作,则应以什么方式创建套接字,以便可以从应用程序内部连接http服务器.以下是我的http服务器套接字的创建方式pthread_create(pt_server, NULL, http_srvr, NULL);//http server handlervoid *http_server(){int sockfd, new_fd;struct sockaddr_in my_addr;struct sockaddr_in their_addr;socklen_t sin_size;struct sigaction sa;int yes1;if ((sockfd socket(PF_INET, SOCK_STREAM, 0)) -1){perror(socket);exit(1);}if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,yes,sizeof(int)) -1){perror(setsockopt);exit(1);}my_addr.sin_family AF_INET; // host byte ordermy_addr.sin_port htons(HTTP_PORT); // short, network byte ordermy_addr.sin_addr.s_addr INADDR_ANY; // automatically fill with my IPmemset((my_addr.sin_zero), \0, 8); // zero the rest of the structif (bind(sockfd, (struct sockaddr *)my_addr, sizeof(struct sockaddr)) -1){perror(bind);exit(1);}printf(Listening to sockets\n);if (listen(sockfd, BACKLOG) -1){perror(listen);exit(1);}sa.sa_handler sigchld_handler; // reap all dead processessigemptyset(sa.sa_mask);sa.sa_flags SA_RESTART;if (sigaction(SIGCHLD, sa, NULL) -1){perror(sigaction);exit(1);}printf(server: waiting for connections...\n);while(1) { // main accept() loopsin_size sizeof(struct sockaddr_in);if ((new_fd accept(sockfd, (struct sockaddr *)their_addr,sin_size)) -1){perror(accept);continue;}printf(server: got connection from %s\n,inet_ntoa(their_addr.sin_addr));handle_connection(new_fd);}}以下是我如何将http POST到我的http服务器/* create socket */if ((s socket(AF_INET, SOCK_STREAM, 0)) 0)return ERRSOCK;setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);/* connect to server */if (connect(s, server, sizeof(server)) 0)retERRCONN;else {if (pfd) *pfds;/* create header */if (proxy) {sprintf(header,%s http://%.128s:%d/%.256s HTTP/1.0\015\012User-Agent: %s\015\012%s\015\012,command,http_server1,http_port,url,http_user_agent,additional_header);} else {sprintf(header,%s /%.256s HTTP/1.0\015\012User-Agent: %s\015\012%s\015\012,command,url,http_user_agent,additional_header);}hlgstrlen(header);/* send header */if (send(s,header,hlg,0)!hlg)ret ERRWRHD;/* send data */else if (length data (send(s,data,length,0)!length) )ret ERRWRDT;else {/* read result check */rethttp_read_line(s,header,MAXBUF-1);以下是http_read_line的内容,并且在此函数中,recv调用被阻止static int http_read_line (fd,buffer,max)int fd; /* file descriptor to read from */char *buffer; /* placeholder for data */int max; /* max number of bytes to read */{ /* not efficient on long lines (multiple unbuffered 1 char reads) */int n0;while (nif (recv(fd,buffer,1,0)!1) {n -n;break;}n;if (*buffer\015) continue; /* ignore CR */if (*buffer\012) break; /* LF is the separator */buffer;}*buffer0;return n;}