无法在 Windows 上创建套接字

问题描述 投票:0回答:3

我有一个很尴尬的问题。以下代码不会在 Windows 上创建套接字;它失败并显示错误消息。谁能简要解释一下为什么会这样?我对如此简单的事情失败感到非常困惑和沮丧。谢谢。

int sock;
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
    printf("error opening socket");
}

编辑:此外,打印出 strerror(errno) 只是显示“无错误”。

c networking winsock sockets
3个回答
14
投票

您需要先调用

WSAStartup()
才能在 Windows 上运行任何其他套接字函数(并且您应该在完成后调用
WSACleanup()
)。


5
投票

看下面的工作示例:

#include <Windows.h>
#include <stdio.h>

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

int _cdecl main(){
   WSADATA Data;
   int socket; // or you can use SOCKET socket
   WSAStartup(MAKEWORD(2, 2), &Data); // 2.2 version
   socket = socket(AF_INET, SOCK_DGRAM, 0);
   if(udep_socket<0){
        printf("Error Creating Socket");
   }else{
        printf("Successfully Created Socket");
   }
   system("pause");
   return 0;
}

以下资源有助于理解:


3
投票

Jerry Coffin 是关于

WSAStartup()
WSACleanup()
的。

还要注意这段代码

if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )

是有问题的,因为

SOCKET
是无符号类型 (
unsigned int
)。

来自

winsock.h

/*
 * This is used instead of -1, since the
 * SOCKET type is unsigned.
 */
#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)

所以,IMO 最好将那条线替换为

if( INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, 0)) )

即使这不是根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.