【问题标题】:C server socket accepts clients with no requestC服务器套接字接受没有请求的客户端
【发布时间】:2012-01-19 16:50:38
【问题描述】:

我会保持简单。
代码:

    #include "stdafx.h"
    #include <winsock2.h>
    #include <conio.h>
    #include <iostream>
    #include <stdio.h>
    #include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    if(error) printf("WinSock error!");
    SOCKET server;
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(5657);
    server_addr.sin_addr.s_addr = htonl (INADDR_ANY); 
    server = socket(AF_INET, SOCK_STREAM, 0);
    if (server == INVALID_SOCKET) printf("INVALID SOCKET!");
    error = bind(server, (LPSOCKADDR)&server_addr, sizeof(server_addr));
    if(error) printf("Connect Error!");
    listen(server, SOMAXCONN);
    printf("SERVER ESTABLISHED! LISTENING...\n");
    sockaddr_in client_addr;
    SOCKET client;
    client = accept(server, (struct sockaddr*)&client_addr, (int *)sizeof(client_addr));
    if(client==INVALID_SOCKET) printf("INVALID SOCKET!\n");
    printf("A CLIENT!");
    closesocket(server);
    WSACleanup();
    getch();
    return 0;
}


但我得到的是:

服务器已建立!听... 无效的套接字! 一个客户!

我已经在 C# 中完成了套接字,我猜服务器应该监听并等待客户端,每当客户端请求连接时,服务器应该接受它,但服务器无需等待就接受套接字,并且这个接受的套接字也是无效的!为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • WSAGetLastError() 返回什么?

标签: c++ c sockets


【解决方案1】:

这个:

(int *)sizeof(client_addr)

错了,您将大小转换为指针。

socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);

【讨论】:

  • 该死!正在输入这个:) +1 击败我
  • 嗨。谢谢,但我发现 socklen_t 是未定义的!任何替代结构???
  • 看起来int 应该没问题:msdn.microsoft.com/en-us/library/windows/desktop/…(只需将socklen_t 替换为int不是 int *)。
【解决方案2】:
(int *)sizeof(client_addr)

您将 client_addr 的大小转换为 int*,因此您有一个指针指向的地址等于您的 client_addr 的大小。

你需要做的:

socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);

这种方式不同,因为你有一个 socklen_t 类型的变量,它保存你的 client_addr 的大小。然后,您将获得一个指针(带有 &),该指针指向包含该数字的内存地址,这就是您想要的。

【讨论】:

  • 嗨。谢谢,但我发现 socklen_t 是未定义的!任何替代结构???我正在使用 Visual Studio 2010。
  • socklen_t 类型是在 windows 的 WS2tcpip.h 中定义的。这不是从 winsock2.h (AFAICT) 传递的。您需要手动包含 WS2tcpip.h 才能使用 socklen_t 类型。 - 取自stackoverflow.com/a/4454036/857994
【解决方案3】:

问题可能是accept 将尝试写入提供给它的最后一个参数。

改为:

int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);

检查WSAGetLastError 的值将提供失败的原因。

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2017-05-26
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多