C++ winsock 奇怪的错误

标签 c++ sockets winsock

我正在制作一个 C++ 网络应用程序并正在创建服务器,但我遇到了一个奇怪的问题。当我调用 listen 时,它应该等待连接,但应用程序继续运行,就像 listen 调用不存在一样。这是我的代码:

#include "includes.hpp"
using namespace std;
SOCKET sv;
WSADATA w;

int serverStart(int port)
{
    int error = WSAStartup(0x0202,&w);
    if(error)
    {
        fprintf(stderr,"Error de startup:%i",error);
        return false;
    }
    if(w.wVersion != 0x0202)
    {
        fprintf(stderr,"Error versión incorrecta de wsadata: Esperada 202.Obtenida %X",w.wVersion);
        WSACleanup();
        return false;
    }
    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    sv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sv == INVALID_SOCKET)
    {
        fprintf(stderr,"Error de socket");
        return false;
    }
    if(bind(sv,(LPSOCKADDR)&addr,sizeof(addr)) == SOCKET_ERROR){
        fprintf(stderr,"Error de bind");
        return false;
    }
    fprintf(stdout,"Listen..");
    listen(sv,SOMAXCONN);
    fprintf(stdout,"Fin");
}

我正在从 main 调用 serverStart。我还停用了防火墙以查看是否是问题所在,但没有奏效。

谢谢

最佳答案

listen 的调用只会将套接字置于接受传入连接的状态。为了真正接受连接,您需要调用 accept 函数。调用 accept 会阻塞程序,直到您获得连接。

SOCKET ClientSocket = INVALID_SOCKET;
// Accept a client socket
ClientSocket = accept(sv, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
    printf("accept failed: %d\n", WSAGetLastError());
    closesocket(sv);
    WSACleanup();
    return 1;
}

关于C++ winsock 奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227833/

相关文章:

java - Java 中的多线程不考虑套接字超时?

c++ - 追踪 WinSock MFC 应用程序中句柄泄漏的来源

c++ - msvc 相当于 gcc 的 __BASE_FILE__

C++地址值和sizeof

python - 如何使用位于不同 NAT 上的套接字在 2 个 Python 程序之间进行通信?

PHP 与 Apple 通知网关的套接字连接失败

c++ - 我在这个套接字中错过了什么? (Windows 套接字)

c++ - winsock客户端和服务器通信

c++ - 在 C++ 中模拟堆上的方法调用?

c++ - 在 C++ 中可靠地比较不同机器的时间戳