我有一个很尴尬的问题。以下代码不会在 Windows 上创建套接字;它失败并显示错误消息。谁能简要解释一下为什么会这样?我对如此简单的事情失败感到非常困惑和沮丧。谢谢。
int sock;
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("error opening socket");
}
编辑:此外,打印出 strerror(errno) 只是显示“无错误”。
您需要先调用
WSAStartup()
才能在 Windows 上运行任何其他套接字函数(并且您应该在完成后调用 WSACleanup()
)。
看下面的工作示例:
#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;
}
以下资源有助于理解:
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)) )
即使这不是根本原因。