c - Winsock 发送函数无限期等待

标签 c winsock

在此代码中,发送函数不阻塞但也不发送。 如果我调用 shutdown ,它就会被强制发送。

如何让这段代码在一秒左右的时间内发送一条小消息?

此代码假设响应网络浏览器的 GET 请求。 (用户输入本地主机:27015) 这只是一个测试,我的工作或更大的项目不需要它。

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")


int main(int argc, wchar_t* argv[]) {

WSADATA wsaData;
int iResult = 0;

SOCKET ListenSocket = INVALID_SOCKET;
sockaddr_in service;

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 

ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);

iResult = bind(ListenSocket, (SOCKADDR *)& service, sizeof(service));

listen(ListenSocket, SOMAXCONN);

auto AcceptSocket = accept(ListenSocket, NULL, NULL);

char getbuf[400];

recv(AcceptSocket, getbuf, 400, NULL);
getbuf[399] = '\0';

printf("%s",getbuf);

char str[] = "HTTP/1.1 200 OK\r\n"
"Date: Sun, 19 May 2018 08 : 56 : 53 GMT\r\n"
"Server : Apache / 2.2.14 (Win32)\r\n"
"Last - Modified : Sat, 20 Nov 2004 07 : 16 : 26 GMT\r\n"
"ETag : \"10000000565a5-2c-3e94b66c2e680\" \r\n"
"Accept - Ranges : bytes\r\n"
"Content - Length : 44\r\n"
"Connection : close\r\n"
"Content - Type : text / html\r\n"
"X - Pad : avoid browser bug\r\n\r\n"

"<html><body><h1>It works!</h1> </body> </html>\r\n\0";


char *sendbuf = (char*)str;
iResult = send(AcceptSocket, sendbuf, (int)strlen(str), 0);

//shutdown(AcceptSocket, SD_BOTH); //forces to send

while (1);
return 0;
}

最佳答案

char str[] = 
"HTTP/1.1 200 OK\r\n"
"Date: Sun, 19 May 2018 08:56:53 GMT\r\n"
"Server: Apache/2.2.14 (Win32)\r\n"
"Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT\r\n"
"ETag: \"10000000565a5-2c-3e94b66c2e680\"\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: 46\r\n"
"Connection: close\r\n"
"Content-Type: text/html\r\n"
"X-Pad: avoid browser bug\r\n\r\n"
"<html><body><h1>It works!</h1></body></html>\r\n";

浏览器不是人,它不知道 Content - Type : 是什么东西,它也不会将 08 : 56 : 53 识别为一个有效的时候,没有 MIME 类型叫做 text/html。停止在不应该有的地方放置空格,浏览器没有大脑,它无法猜测。

您还明确告诉连接将在发送数据后关闭, header Connection: close,但您没有这样做。如果您打算保持连接有效,请使用 Connection: keep-alive

此外,您的数据长度不是 44 字节。

关于c - Winsock 发送函数无限期等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438942/

相关文章:

c - 如何使用winsock或wininet下载文件

c++ - winsock 客户端套接字无效

c - 我对整数数组有疑问;很难解释

c - UDP sendto 环回性能

顺序更改时 c 结构成员意外更改

c - 对 getaddrinfo 的 undefined reference

c - 警告 : left shift count >= width of type

c - realloc 导致释放对象的校验和不正确

windows - WinSock recv() 超时 : setsockopt()-set value + half a second?

c++ - WSAGetLastError() 返回 122