我正在尝试在c中创建一个小的http服务器但是我用httperf得到CONNRESET错误,为什么?
#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 :(得分:3)
您accept
时就关闭了套接字。因此,连接在其另一端重置。
如果要与HTTP客户端通信,则必须解析传入的HTTP请求,并使用有效的HTTP数据进行回复。 (警告:这不是微不足道的。)
请阅读这篇文章:nweb: a tiny, safe Web server (static pages only)例如,它对于最小的HTTP服务器需要做些什么有一个很好的概述。
答案 1 :(得分:1)
好的,感谢您的帮助,我刚刚在关闭客户端套接字之前添加了这个,并且没有更多的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);