C套接字编程: HTTP request not working continously

标签 c http sockets networking request

我是 c 套接字编程和 c 本身的新手。我写了一小段代码,从另一个互联网套接字读取原始输入并将数据发布到网络服务器。接收到的数据始终是数字。然而问题似乎是 http post 请求只发生一次而不是在循环中运行并且程序终止。

下面是代码示例

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>

//define server parameters
#define WEBIP       "172.16.100.2"






int main()
{
        //declare variables
        struct sockaddr_in my_addr,client_addr,server_addr;
        struct hostent *server_host;
        int true=1;
        int client_socket_id,server_socket_id;
        int client_id;int sin_size;
        int client_bytes_received;
        char send_data [1024],recv_data[1024],post_data[1024];       

        server_host=gethostbyname(WEBIP2);

        //create a socket to listen to client
        if ((client_socket_id = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Error Creating Socket");
            exit(1);
        }
        if (setsockopt(client_socket_id,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
            perror("Setsockopt");
            exit(1);
        }
        //create socket to connect to webserver
        if ((server_socket_id = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Error Creating Webserver Socket");
            exit(1);
            }

        my_addr.sin_family = AF_INET;         
        my_addr.sin_port = htons(7070);     
        my_addr.sin_addr.s_addr = INADDR_ANY; 
        //bzero(&(my_addr.sin_zero),8); 
        bzero(&(server_addr.sin_zero),8); 
        server_addr.sin_family = AF_INET;         
        server_addr.sin_port = htons(WEBPORT);     
        server_addr.sin_addr = *((struct in_addr *)server_host->h_addr);





        //bind to a socket
        if (bind(client_socket_id, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) {
            perror("Unable to bind");
            exit(1);
        }

        //listen to socket
        if (listen(client_socket_id, 5) == -1) {
            perror("Error Listening to Socket");
            exit(1);
        }

        printf("\n\r Waiting for client on port 7070");
        fflush(stdout);


        while(1)
        {  

            sin_size = sizeof(struct sockaddr_in);
            client_id = accept(client_socket_id, (struct sockaddr *)&client_addr,&sin_size);
            printf("\n I got a connection from (%s , %d)",
                   inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

            //connect to remote server
            if (connect(server_socket_id, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1) 
                {
                    perror("Error Connecting to Web Server");
                    exit(1);
                }


            while(1){

            //send some data to client
            send(client_id,"Hello, World!",13, 0); 
            //receive some data from client
            client_bytes_received=recv(client_id,recv_data,1024,0);
            recv_data[client_bytes_received] = '\0';
            //print received_data
            int c_length=strlen(recv_data)+11;
            printf("\n\rRecieved data (%d bytes %d words)= %s " , client_bytes_received,c_length,recv_data);
            //post dta to webserver
            fflush(stdout);
            bzero(&post_data,1024);
            sprintf(post_data,"POST /environment.php HTTP/1.1\r\n"
                            "Host: 172.16.100.2\r\n"
                            "User-Agent: C Example Client\r\n"
                            "Content-Type: application/x-www-form-urlencoded\r\n"
                            "Content-Length: %d\r\n\r\n"
                            "track_data=%s",c_length,recv_data);
            write(server_socket_id,post_data,strlen(post_data)+1); 
            bzero(&recv_data,1024);


            while((client_bytes_received=read(server_socket_id,recv_data,1024))>0){
            recv_data[client_bytes_received] = '\0';
                if (fputs(recv_data,stdout)==EOF)
                    perror("web server read_error");
                }
            //print received_data
            printf("\n\rRecieved data from webserver (%d)= %s " , client_bytes_received,recv_data);
            //
            bzero(&recv_data,1024);
            fflush(stdout);



         }
        }  
        close(client_id);

    close(client_socket_id);
    return 0;
} 

最佳答案

多年没有做socket编程,还请大家多多包涵。您需要连接、处理然后断开连接吗?这是阅读您的代码时想到的第一件事。

关于C套接字编程: HTTP request not working continously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831641/

相关文章:

当 .exe 在 Windows 7 32 位上运行时,使用 GCC 编译的 C 程序会导致 NVTDM 错误

c - 对适当色带的电阻(欧姆)

http - CORS Access-Control-Max-Age 被忽略

node.js - 将整个 HTTP 通信转储为 nodejs 中的原始数据

Android 没有通过 serverSocket.accept();

c - 每行仅从 strtok() 获取 2 个标记

c - 获取与 C 中的 int val 关联的枚举名称。避免从 int 到 enum 的类型转换

java - Android - 在 fragment 中使用连接管理器

Java UDP 组播

sockets - 哪个IPC更高效?