C服务器套接字接受没有请求的客户端

C server socket accepts clients with no request

本文关键字:请求 客户端 服务器 套接字      更新时间:2023-10-16

我会保持简单
代码:

    #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#中完成了套接字,我想服务器应该侦听并等待客户端,每当客户端请求连接时,服务器都应该接受它,但服务器不等待就接受了套接字,而且这个接受的套接字也是无效的!为什么会发生这种情况,我该如何解决?

这:

(int *)sizeof(client_addr)

是错误的,您正在将大小转换为指针。

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

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

你需要做:

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

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

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

更改为:

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

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