2011-05-19 132 views
0

我想在c中製作一個微小的http服務器,但我得到了與httperf的CONNRESET錯誤,爲什麼?C HTTP服務器/連接重置

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <signal.h> 

#include <unistd.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <fcntl.h> 

#define SOCKERROR -1 

#define SD_RECEIVE 0 
#define SD_SEND 1 
#define SD_BOTH 2 

int server; 
int client; 

... 

int main(int argc, char *argv[]) 
{ 
    int status; 

    int accepted; 

    struct addrinfo hint; 
    struct addrinfo *info; 

    struct sockaddr addr; 
    socklen_t addrsize; 

    int yes = 1; 

    ... 

    // client 

    addrsize = sizeof addr; 

    while (1) 
    { 
     memset(&accepted, 0, sizeof accepted); 
     memset(&addr, 0, sizeof addr); 

     accepted = accept(server, &addr, &addrsize); 

     if (accepted == SOCKERROR) { 
      warn("Accept", errno); 
     } else { 
      shutdown(accepted, SD_SEND); 
      close(accepted); 
     } 
    } 

    // shutdown 

    ... 

    return EXIT_SUCCESS; 
} 
+0

的httperf將發送數據,您的應用程序忽略它......我想象perf工具正在超時/緩衝區正在變滿,並且連接正在關閉。如果忽略發送到套接字的IO,最終一方會放棄,操作系統不會永久地緩衝它。 – forsvarir 2011-05-19 09:11:49

回答

3

只要你accept它就關閉了插座。所以連接在另一端被重置。

如果您想要與HTTP客戶端交談,您將不得不解析傳入的HTTP請求,並回復有效的HTTP數據。 (警告:這不是微不足道的。)

例如,請閱讀此文章:nweb: a tiny, safe Web server (static pages only)例如,它有一個很好的簡要介紹了最小HTTP服務器需要完成的工作。

+0

我是否只需閱讀併發送任何數據以避免connreset錯誤? – Fabien 2011-05-19 09:14:43

+0

那個......那個...... +1 – forsvarir 2011-05-19 09:15:37

+0

@Fabien:當然。如果你不讀或寫數據,充其量客戶將無所事事。 – Mat 2011-05-19 09:17:57

1

OK,感謝您的幫助,我剛剛關閉客戶端套接字前加入這一點,並沒有更多的CONNRESET錯誤:

char readBuffer[128]; 
char *sendBuffer = "HTTP/1.0 200 OK\r\n" 
    "Content-Type: text/html\r\n" 
    "Content-Length: 30\r\n\r\n" 
    "<html><body>test</body></html>"; 

do { 
    status = recv(accepted, readBuffer, sizeof readBuffer, MSG_DONTWAIT); 
} while (status > 0); 

send(accepted, sendBuffer, (int) strlen(sendBuffer), 0);