服务器在回复之前关闭连接

时间:2014-04-25 11:30:53

标签: c tcpclient tcp-ip

我正在关注有关TCP / IP客户端的MSDN课程;我的问题是服务器没有回复,并且在我发送标题后连接关闭。

const char *USR_PORT = "80";
#define BUFF_LEN 512
char recv_buf[BUFF_LEN];
const char HEADER_TO_SEND[] = "HEAD / HTTP/1.1\r\nHost: www.microsoft.com\r\nUser-Agent: RequestHeaderC\r\n\r\n";
{...}
do {
    iRes = recv(ConnSocket, recv_buf, BUFF_LEN, 0);
    if (iRes > 0)
    {
        printf("Bytes received: %d\n", iRes);
        for (i = 0; (i < iRes) && recv_buf[i] != '\0'; i++)
            printf("%c", recv_buf[i]);
    }
    else if (iRes == 0)
        printf("Connection closed by the server.\n");
    else printf("Error: %d\n", WSAGetLastError());
} while (iRes > 0);

我几乎可以肯定连接很好,因为我成功发送了字节。 我根本没有收到任何字节。   其他代码几乎与教程中的代码相同,这就是我没有发布它们的原因。如果需要,我会

如果删除此行,服务器不会立即关闭连接:

shutdown(ConnSocket, SD_SEND);

但是,即使我添加了

,我也没有得到任何答案
Connection: close\r\n
标题中的

完整代码:

const char *USR_PORT = "80";
#define BUFF_LEN 512
char USR_ADDR[] = "www.microsoft.com";
const char HEADER_TO_SEND[] = "HEAD / HTTP/1.1\r\nHost: www.microsoft.com\r\nUser-Agent: RequestHeaderC\r\nConnection: close\r\n\r\n";

int main()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
    printf("Error: Wsastartup\n");
    exit(1);
}
int iRes;
addrinfo *result, *ptr, addr;
SecureZeroMemory(&addr, sizeof(addr));
addr.ai_family = AF_INET;
addr.ai_protocol = IPPROTO_TCP;
addr.ai_socktype = SOCK_STREAM;
iRes = getaddrinfo(USR_ADDR, USR_PORT, &addr, &result);
if ( iRes != 0 )
{
    printf("Error: getaddrinfo");
    WSACleanup();
    exit(2);
}
SOCKET ConnSocket;
ptr = result;

ConnSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnSocket == INVALID_SOCKET)
{
    printf("Error: socket: %ld \n", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    exit(3);
}
if (connect(ConnSocket, ptr->ai_addr, (int)ptr->ai_addrlen) )
{
    closesocket(ConnSocket);
    ConnSocket = INVALID_SOCKET;
}
if (ConnSocket == INVALID_SOCKET)
{
    printf("Invalid Socket\n");
    exit(4);
}

const char *send_buf = HEADER_TO_SEND;
char recv_buf[BUFF_LEN];
if ((iRes = send(ConnSocket, send_buf, strlen(send_buf) - 1, 0)) == SOCKET_ERROR)
{
    printf("Error: send\n");
    closesocket(ConnSocket);
    WSACleanup();
    exit(5);
}
int i;
for (i = 0; i < iRes; i++)
    printf("%c", send_buf[i]);
printf("Bytes sent: %d\n", iRes);


//if (shutdown(ConnSocket, SD_SEND) == SOCKET_ERROR)
//{
//  printf("Error: shutdown: %d\n", WSAGetLastError());
//  closesocket(ConnSocket);
//  WSACleanup();
//  exit(6);
//}


//do {
    iRes = recv(ConnSocket, recv_buf, sizeof(recv_buf)-1, 0);
    if (iRes > 0)
    {
        printf("Bytes received: %d\n", iRes);
        recv_buf[iRes] = '\0';
        for (i = 0; i < iRes; i++)
            printf("%c", recv_buf[i]);
    }
    else if (iRes == 0)
        printf("Connection closed by the server.\n");
    else printf("Error: %d\n", WSAGetLastError());
//} while (iRes > 0);

getchar();
getchar();
closesocket(ConnSocket);
WSACleanup();

return 0;
}

0 个答案:

没有答案