我有一个非常尴尬的问题。以下代码不会在Windows上创建套接字;它失败并显示错误消息。任何人都可以简单解释为什么会这样吗?如此简单的失败让我感到非常困惑和沮丧。谢谢。
int sock;
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("error opening socket");
}
编辑:此外,打印输出strerror(错误)只显示“无错误”。
答案 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;
}