此代码不会一直运行。我可能限制了端口的权限,但我不确定如何测试它

时间:2016-02-01 22:26:50

标签: c sockets networking tcp

#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc , char *argv[])
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message , server_reply[2000];
    int recv_size;


    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

//Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("74.125.235.20");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    //Connect to remote server
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");

    //Send some data
    message = "GET / HTTP/1.1\r\n\r\n";
    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    puts("Data Send\n");

    //Receive a reply from the server
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }

    puts("Reply received\n");

    //Add a NULL terminating character to make it a proper string before printing
    server_reply[recv_size] = '\0';
    puts(server_reply);

    return 0;
}

My output

2 个答案:

答案 0 :(得分:0)

引自维基百科:

  

1024到49151 的端口号范围是已注册的端口。   它们由IANA分配,以便在申请时提供特定服务   请求实体。[1]在大多数系统上,可以使用注册的端口   普通用户。

这意味着任何低于1024的端口都不会工作,因为它们已被分配。

答案 1 :(得分:0)

您的输出显示您的代码已通过“Socket created”,但未达到“Connected”。由于您没有“connect error”,connect()尚未失败。由于您没有中止,因此很可能您无法等待建立连接。

测试它的一种方法是尝试使用http://<ip address>直接在浏览器中打开地址(相当于与端口80通信)

根据this site,您正在与之交谈的地址属于Google,但其端口80已关闭。谷歌方面的安全措施可能会过滤拒绝连接。这可以解释为什么您遇到长时间超时而不是快速失败消息。

另一种测试代码的方法是使用有效http服务器的地址。要查找一个,请运行命令行,键入“ping google.com”并获取程序中ping请求显示的地址。然后连接将成功。