1

我在windows中使用了linux部分代码来建立RDB通信。虽然套接字打开成功,但我无法将套接字与定义的 IP 地址绑定。Linux 和 Windows 在 socket 上是否有任何限制?

这是我的代码,

    SOCKET sock;
    SOCKET sClient;
    struct sockaddr_in server;
    char szServer128; // Server to connect to
    char szBuffer204800; // allocate on heap

    sClient = udpsock_open(&server, szServer, DEFAULT_RX_PORT);

    int udpsock_open(struct sockaddr_in *psa, char *ipv4, uint16_t port) {
    WSADATA wsaData;

    int opt;
    int domain = AF_INET;
    int type = SOCK_DGRAM;
    int proto = IPPROTO_UDP;
    sClient = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (sClient  0)
        printf(" WSAStartup Successful %I64d\n", sClient);
    else
        printf("Failed. Error Code : %d\n", WSAGetLastError());
// Prepare a socket to listen for connections
    if ((sock = WSASocket(domain, type, 0, NULL, 0, WSA_FLAG_OVERLAPPED))  INVALID_SOCKET)
    {
        printf("WSASocket() failed with error %d\n", WSAGetLastError());
        return 1;
    }
    else
    {
        printf("WSASocket() is OK!\n");
    }
    if (sock < 0)
    {
        //rtos_log ( LOG_ERR, "Failed to open socket %m" );
        printf("Failed to open socket %I64d\n", sock);
        return -1;
    }
    set_reuse(sock);
    memset(psa, 0x00, sizeof(struct sockaddr_in));
    psa->sin_family = domain;
    psa->sin_port = htons(port);
    psa->sin_addr.s_addr = inet_addr(ipv4);
   if (bind(sock, ( struct sockaddr *)psa, sizeof(struct sockaddr_in)) < 0)
    {
        printf("Failed to bind socket Error: %d\n", WSAGetLastError());
        closesocket(sock);
        WSACleanup();
        return -4;
    }
    opt = 1;
    char                 buf[2048];
    DWORD        dwBytesRet;
    //ioctlsocket(sock, FIONBIO, &opt)
    if (WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY,NULL,0, buf,2048, &dwBytesRet,NULL,NULL) == SOCKET_ERROR)
    {
        printf("ioctlsocket() failed with error %d\n", WSAGetLastError());
        return 1;
    }
   else
    {
        printf("ioctlsocket() is OK!\n");
    }
    return sock;
    }
4

0 回答 0