无法在Windows上创建套接字

时间:2010-01-05 05:17:05

标签: c networking winsock sockets

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

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

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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)) )

即使这不是根本原因。

答案 2 :(得分:2)

一个例子:

#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;
}