【问题标题】:Winsock C TCP SocketWinsock C TCP 套接字
【发布时间】:2011-12-20 01:28:39
【问题描述】:

我之前在 Python 中使用过 TCP 套接字。它在 C 中看起来非常相似,但我什么也做不了。 socket(AF_INET, SOCK_STREAM, 0); 返回 -1,这当然表示错误。我怎么会这么快就错了? 如果你能帮我解决这个问题,那就太好了,但如果你能给我提供一些简单的、基本的源代码,那将非常有帮助。它甚至不需要真正做任何事情,也不需要处理错误。我只需要了解如何正确创建服务器套接字、绑定它、监听它并接受客户端以及如何创建和连接客户端套接字。我可以自己弄清楚所有的花里胡哨。

谢谢!

【问题讨论】:

  • WSAGetLastError() 在您的套接字调用后返回什么?
  • 运行程序的用户是否有权使用网络?
  • WSAGetLastError 返回 10093,我经常运行用 Python 编写的使用套接字的程序。

标签: c sockets tcp winsock


【解决方案1】:

在拨打任何其他 winsock 电话之前,您是否曾致电 WSAStartup

【讨论】:

    【解决方案2】:

    您需要先使用WSAStartup 函数初始化WinSock,然后才能使用套接字。 Python 在 Windows 上的套接字实现可能会自动调用它,因此您不必担心它,但是当直接使用 WinSock 时,在任何其他 WinSock 调用之前调用 WSAStartup 很重要,并且当您的程序使用套接字完成时,您需要拨打WSACleanup

    WSAData data;
    
    if (WSAStartup(MAKEWORD(2, 2), &data) != 0)
    {
        // unable to initialise WinSock, time to quit
    }
    
    // WinSock has been successfully initialised, time to make sockets!
    int s = socket(...);
    
    // After all WinSock stuff is done, balance out your WSAStartup with a cleanup:
    WSACleanup();
    

    【讨论】:

    • 感谢您向我展示如何使用 WSAStartup。这种 C 编程让我很困惑……
    【解决方案3】:
    【解决方案4】:

    可能只是进程无权创建套接字(errno == EACCES)。

    也许你的 python 解释器得到了不同的安全上下文,检查一下。

    无论如何,安全总比抱歉好,所以放上类似的东西:

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
            perror("myapp");
            exit(1);
    }
    

    如果 Winsock 实际设置了errno,则 IDK,但它应该...

    【讨论】:

    • Winsock 不是 CRT 的一部分,因此它无法访问 errno。但是,它确实设置了一个可以使用WSAGetLastError 检索的错误代码。
    • 这很奇怪,errno 无论如何都应该是可定位的......(但你总是可以从微软的软件中得到类似的东西)
    • 那么有什么函数可以将它翻译成人类可读的文本字符串吗?
    • 这不是“微软的软件”——这是运行时和操作系统不同的问题。 errno 不是系统的东西,它是运行时库的东西。非 RTL 函数不应该真正触及它。至于把它变成错误字符串,有FormatMessage function
    • 是的,它是“微软的软件”的东西,errno 是c 库的标准组件,用于报告任何 系统错误。 IPC 错误是系统错误。他们只是错误地实施了它。此外,术语 RTL 没有意义,为什么要链接一个在运行时不会使用的库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2018-06-19
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多