第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C套接字間歇性地重置連接并且沒有收到來自python請求的完整請求

C套接字間歇性地重置連接并且沒有收到來自python請求的完整請求

紅糖糍粑 2022-11-01 16:15:04
我有一個 python 程序,我想通過 http 與 C 程序通信。我在 python 中使用請求將一些 json 數(shù)據(jù)發(fā)送到 C 中的套接字。有時,python 會吐出“由對等方重置連接”錯誤,我無法弄清楚。當我收到這個錯誤時,除了請求的內(nèi)容之外的所有內(nèi)容都由 C 程序發(fā)送和接收。在我的應用程序中,我還從一個用 Go 編寫的客戶端發(fā)出請求。對于那個客戶端,我永遠不會收到這些錯誤,這就是為什么我認為我在請求庫中缺少一些配置或簡單的解決方案。為什么會發(fā)生這種情況,什么可以解決我的問題?這是一個簡單的例子;套接字的東西顯然是我不太熟悉的:C服務器:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#define RECV_BUF_SIZE 1024int main(void){    struct sockaddr_in serv_addr, cli_addr;    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = INADDR_ANY;    serv_addr.sin_port = htons(8080);    int option = 1;    int socketfd = socket(AF_INET, SOCK_STREAM, 0);    setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));    if (socketfd < 0)    {        perror("failed to start socket");        exit(1);    }    if (bind(socketfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)    {        perror("failed to bind");        exit(1);    }    if (listen(socketfd, 1000) != 0)    {        perror("listen error");        exit(1);    }    char buf[RECV_BUF_SIZE];    while (1)    {        int addrlen = sizeof(cli_addr);        int clientfd = accept(socketfd, (struct sockaddr*) &cli_addr, &addrlen);        if (clientfd < 0)        {            perror("accept error");        }        else        {            int n_recv = recv(clientfd, buf, RECV_BUF_SIZE, 0);            // print everything, character by character.            char* tmp_buf = buf;            while (n_recv--) printf("%c", *tmp_buf++);            printf("\n\n****************************\n\n");            FILE* res = fdopen(clientfd, "w");            fprintf(res, "HTTP/1.1 200 OK\r\n\r\n");            fclose(res);            shutdown(clientfd, SHUT_RDWR);            close(clientfd);        }    }}Python 請求腳本:import requestsjson_data = {    "hello": "thanks"}requests.post("http://localhost:8080", json=json_data)謝謝!
查看完整描述

1 回答

?
喵喵時光機

TA貢獻1846條經(jīng)驗 獲得超7個贊

關于服務器與客戶端的通信,有幾個小問題,比如不正確的變量類型和缺乏錯誤檢查。


我在我的評論前面加上了>>'條件編譯'來展示我如何用建議的改進替換了 OPs 代碼的某些部分。


警告:由于服務器不知道從客戶端接收的預期字節(jié)數(shù),因此答案不包括循環(huán),試圖檢索客戶端預期的所有字節(jié)


char buf[ RECV_BUF_SIZE +1 ];  // >> +1 for string terminator


while (1)

{

    // >> the third parameter is a 'socklen_t', not an 'int'

    socklen_t addrlen = sizeof(cli_addr);

    int clientfd = 

        accept(socketfd, (struct sockaddr*) &cli_addr, &addrlen);

    if (clientfd < 0)

    {

        perror("accept error");

    }


    else

    {

        // >>recv() returns a `ssize_t`, not an `int`

        ssize_t n_recv = recv(clientfd, buf, RECV_BUF_SIZE, 0);


        #if 0


            // >>this takes WAY too long, so the connection

            // >>could timeout

            // print everything, character by character.

            char* tmp_buf = buf;

            while (n_recv--) printf("%c", *tmp_buf++);


        #else


            if( n_recv < 0 )

            {  // then an error occurred

                perror( "recv failed" );

                write( clientfd, 

                       "receive error", 

                       sizeof( "receive error" ) );

                close( clientfd );

            }


            else if( n_recv == 0 )

            {  // then client closed connection

                printf( "%s\n", 

                        "client closed connection" );

                close( clientfd );

            }


            else

            { // some data received from client

                buf[ n_recv ] = '\0';  // terminate string

                printf( "%s\n", buf );

            }


        #endif


        printf("\n\n****************************\n\n");


        #if 0


            FILE* res = fdopen(clientfd, "w");

            fprintf(res, "HTTP/1.1 200 OK\r\n\r\n");

            fclose(res);

            shutdown(clientfd, SHUT_RDWR);

            close(clientfd);


        #else


            ssize_t writeBytes;

            if( (writeBytes = 

                 write( clientfd, 

                        "HTTP/1.1 200 OK\r\n\r\n", 

                        strlen( "HTTP/1.1 200 OK\r\n\r\n" ) ) ) 

                        != strlen( "HTTP/1.1 200 OK\r\n\r\n" ) )

            { // then incomplete write

                printf( "%s\n",  

                        "write didn't write all bytes to client" );

            }


            close( clientfd );


        #endif

    }

}

分享

編輯

跟隨關于服務器與客戶端的通信,有幾個小問題,比如不正確的變量類型和缺乏錯誤檢查。


我在我的評論前面加上了>>'條件編譯'來展示我如何用建議的改進替換了 OPs 代碼的某些部分。


警告:由于服務器不知道從客戶端接收的預期字節(jié)數(shù),因此答案不包括循環(huán),試圖檢索客戶端預期的所有字節(jié)


char buf[ RECV_BUF_SIZE +1 ];  // >> +1 for string terminator


while (1)

{

    // >> the third parameter is a 'socklen_t', not an 'int'

    socklen_t addrlen = sizeof(cli_addr);

    int clientfd = 

        accept(socketfd, (struct sockaddr*) &cli_addr, &addrlen);

    if (clientfd < 0)

    {

        perror("accept error");

    }


    else

    {

        // >>recv() returns a `ssize_t`, not an `int`

        ssize_t n_recv = recv(clientfd, buf, RECV_BUF_SIZE, 0);


        #if 0


            // >>this takes WAY too long, so the connection

            // >>could timeout

            // print everything, character by character.

            char* tmp_buf = buf;

            while (n_recv--) printf("%c", *tmp_buf++);


        #else


            if( n_recv < 0 )

            {  // then an error occurred

                perror( "recv failed" );

                write( clientfd, 

                       "receive error", 

                       sizeof( "receive error" ) );

                close( clientfd );

            }


            else if( n_recv == 0 )

            {  // then client closed connection

                printf( "%s\n", 

                        "client closed connection" );

                close( clientfd );

            }


            else

            { // some data received from client

                buf[ n_recv ] = '\0';  // terminate string

                printf( "%s\n", buf );

            }


        #endif


        printf("\n\n****************************\n\n");


        #if 0


            FILE* res = fdopen(clientfd, "w");

            fprintf(res, "HTTP/1.1 200 OK\r\n\r\n");

            fclose(res);

            shutdown(clientfd, SHUT_RDWR);

            close(clientfd);


        #else


            ssize_t writeBytes;

            if( (writeBytes = 

                 write( clientfd, 

                        "HTTP/1.1 200 OK\r\n\r\n", 

                        strlen( "HTTP/1.1 200 OK\r\n\r\n" ) ) ) 

                        != strlen( "HTTP/1.1 200 OK\r\n\r\n" ) )

            { // then incomplete write

                printf( "%s\n",  

                        "write didn't write all bytes to client" );

            }


            close( clientfd );


        #endif

    }

}



查看完整回答
反對 回復 2022-11-01
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號