【问题标题】:Error connection to remote server in socket programming using c使用 c 在套接字编程中连接到远程服务器时出错
【发布时间】:2016-11-15 06:29:43
【问题描述】:

这是一个示例代码,我尝试将请求传递给服务器并获取所需的数据。 但是我连接到远程服务器的代码并没有像我想象的那样工作。

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

puts("Connected");

我不知道为什么条件值低于零。为什么连接没有完成?

完整代码:

    /*
    Create a TCP socket
*/

#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);
    closesocket(s);
    WSACleanup();

    return 0;
}

【问题讨论】:

  • 而不是puts("connect error"); 尝试perror("connect"),或使用WSAGetLastError() 的结果,就像您在其他地方所做的那样。然后,您将自己看到问题所在。当系统已经提供了精确的错误信息时,不要自己编造模糊的错误信息。在这里报告您自己的错误消息而不是系统的错误消息只是浪费大家的时间。

标签: c windows sockets


【解决方案1】:

在分配给它之前,您需要将整个 sockaddr_in 初始化为零。

memset( &server, 0, sizeof(server) );
server.sin_addr.s_addr = inet_addr("74.125.235.20");
server.sin_family = AF_INET;
server.sin_port = htons( 80 );

我复制了您的代码并尝试了它,它似乎可以工作,也许您的防火墙正在干扰。

顺便说一句,我将您的 inet_addr 调用更改为

InetPtonA( AF_INET, "74.125.235.20", &server.sin_addr.s_addr );

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 2020-01-09
    • 1970-01-01
    • 2020-09-11
    • 2021-12-15
    • 2012-09-14
    • 2022-06-27
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多