windows下C套接字编程

标签 c sockets

您好,我是套接字编程的新手,我正在尝试使用 http://www.binarytides.com/winsock-socket-programming-tutorial/ 教程中的以下代码

我正在尝试连接到服务器,并且我使用的是 google 的 IP 地址。这是代码:

#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;

    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.224.72");
    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");

    return 0;
}

到目前为止可以创建套接字但我无法连接到服务器。更具体地说,我总是退出并具有以下内容:

程序“[2060] SocketCTest.exe: Native”已退出,代码为 1 (0x1)。

即使我在返回前设置了一个断点。

最佳答案

没有错误。我已经在我的计算机上尝试过,但连接返回错误 (WSAETIMEDOUT)。我不确定我的电脑、代理、防火墙等是否有网络设置;或者该 google 主机配置为不接受直接套接字连接。

无论如何,这里是您的代码并进行了一些小的调整:

#include <stdio.h>
#include <conio.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 c = 0;

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

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d.\n", WSAGetLastError());
        WSACleanup();
        c = getch();
        return 1;
    }
    printf("Socket created. Connecting...\n");
    memset(&server, 0, sizeof server);
    server.sin_addr.s_addr = inet_addr("74.125.224.72");
    server.sin_family = AF_INET;
    server.sin_port = htons(80);

    //Connect to remote server
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        printf("Connect error:%d.\nPress a key to exit...", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        c = getch();
        return 1;
    }
    puts("Connected.\nPress a key to exit...");
    closesocket(s);
    WSACleanup();
    c = getch();
    return 0;
}

现在,如果您想查看实际连接的代码,我建议您使用 localhost (127.0.0.1) 而不是 74.125.224.72 ,以及端口 3389(它是远程桌面服务器 (RDP) 端口,如果您的计算机上配置并运行了 RDP)而不是 80;或者,如果您的计算机上运行着 Web 服务器(IIS?),您可以让 80

要获取在您的计算机上运行的服务器程序列表,请运行以下命令:

`netstat -an | findstr LISTEN`

这将以这种形式输出一堆行(我们关心的是)(这是对应于上面的 RDP 示例的行):

`TCP    127.0.0.1:3389         0.0.0.0:0              LISTENING`

关于windows下C套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323015/

相关文章:

c - 局部变量和静态变量

c - 多宿主 TCP 服务器和客户端陷入循环

c - 如何检查套接字是否在c中使用,以在单个套接字上同时执行多个写入

c - 迁移到蓝牙 3.1

c++ - 在C/C++中使用双指针有什么好处

c - 如何使用 Clion 导出 .c 文件,我需要它在分时终端中

c sockets - 没有收到所有发送的数据

c - 求最长递增子序列的长度

sockets - 将数据从 TCP IP 重定向到/dev/tty*--但没有连接物理设备

c - 套接字编程: bind()-invalid argument