Winsock C TCP Socket

4
我之前在Python中使用过TCP套接字。虽然在C语言中看起来很相似,但我无法使其工作。 socket(AF_INET, SOCK_STREAM, 0); 返回-1,这当然表示出现了错误。我怎么会如此迅速地犯错呢?
如果您能帮我解决这个问题,那就太好了,但如果您能为我提供一些简单、基本的源代码,那将非常有帮助。它甚至不需要做任何事情,也不需要处理错误。我只需要看到如何正确地创建服务器套接字、绑定它、监听它并接受客户端,以及如何创建和连接客户端套接字。我可以自己解决所有的细节。
谢谢!

2
你的套接字调用后,WSAGetLastError() 返回什么? - greatwolf
程序运行的用户是否有使用网络的权限? - cHao
WSAGetLastError 返回10093,而我经常运行使用套接字编写的Python程序。 - Void Star
4个回答

9

在进行任何其他Winsock调用之前,您是否已经调用了WSAStartup?


8
您需要使用WSAStartup函数初始化WinSock,才能使用套接字。在Windows上,Python实现套接字可能会自动调用此功能,因此您不必担心它。但是,如果直接使用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编程让我感到困惑... - Void Star


0

可能只是该进程没有权限创建套接字(errno == EACCES)。

也许您的Python解释器正在获取不同的安全上下文,请检查一下。

无论如何,安全第一,所以最好放置类似以下内容:

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

我不确定Winsock是否实际设置errno,但它应该这样做...


Winsock不是CRT的一部分,因此它无法访问errno。但是,它会设置一个错误代码,可以使用WSAGetLastError来检索该代码。 - cHao
很奇怪,errno 应该是可以定位的...(但你总是可以从微软的软件中期待这样的事情) - Ismael Luceno
这不是“微软的软件”问题 - 这是运行时和操作系统不同的问题。 errno 不是系统的东西,而是运行时库的东西。 非 RTL 函数不应该真正接触它。 至于将其转换为错误字符串,有 FormatMessage 函数 - cHao
是的,这是一个“微软的软件”问题,errno是c库的标准组件,用于报告任何系统错误。IPC错误是系统错误。只是他们实现有误。另外,术语RTL没有意义,为什么要链接一个在运行时不会使用的库呢? - Ismael Luceno
另外,我想补充的是,任何来自系统调用的内容都必须通过 errno 进行报告。 - Ismael Luceno
显示剩余19条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接