gpt4 book ai didi

c - 套接字绑定(bind)失败(C 与 WinSock)

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:28 25 4
gpt4 key购买 nike

这应该将套接字绑定(bind)到本地主机上的端口并接受 TCP 连接。当我运行它时,我收到“绑定(bind)错误”消息。我用了this教程(请参阅“接受连接”部分),我能看到的与我的代码之间的唯一显着区别是服务器地址和端口成员初始化的位置,只要它们出现在 bind()调用?

我在 Windows 防火墙(在 Windows 7 上)中添加了一条新规则,以允许来自此可执行文件的 TCP 连接在端口 8888 上,但这似乎没有帮助。

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

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char *argv[])
{
WSADATA wsa;
SOCKET s, new_socket;
struct sockaddr_in server, client;
int c;

printf("\nInitializing WinSock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error code: %d\n\n", WSAGetLastError());
exit(1);
}

printf("\nInitialized.");

server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
server.sin_family = AF_INET;


if (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)
{
printf("\nCould not create socket: %d", WSAGetLastError());
exit(1);
}
printf("\nSocket created.\n");

if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("\nBind error.\n\n");
exit(1);
}
printf("\nSocket bound to port 8888.\n\n");
listen(s, 3);

printf("\nWaiting for incoming connections...");

c = sizeof(struct sockaddr_in);
new_socket = accept(s, (struct sockaddr *)&client, &c);
if (new_socket == INVALID_SOCKET)
{
printf("\nAccept failed.\n\n");
exit(1);
}
printf("\nConnection accepted.");


closesocket(s);
WSACleanup();

return 0;
}

最佳答案

这个声明:

if (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)

在赋值周围需要一组额外的括号:

if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)

== 运算符的优先级高于 = 运算符(请参阅 Operator Precedence ),因此您的原始语句隐含地就像您这样写一样相反:

if (s = (socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET))

如果 socket() 成功,则比较结果为 false,然后将 0 分配给 s (由于 SOCKET 只是 UINT_PTR 的别名,因此允许将 bool 值分配给 SOCKET 变量),然后 bind( ) 将因 WSAENOTSOCK 错误而失败(如果 socket() 失败,比较将评估为 true,这将分配 1s,然后 if 将评估为 true,您的进程将退出)。

就我个人而言,我不喜欢在同一语句中进行赋值和比较的代码。这样会更清晰、更安全:

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)

此外,不要忘记在 accept() 成功后在 new_socket 上调用 closesocket()

关于c - 套接字绑定(bind)失败(C 与 WinSock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com