问题
I have quite an embarrassing problem. The following code simply will not create a socket on Windows; it fails and displays the error message. Could anyone briefly explain why this might be? I'm incredibly confused and frustrated that something so simple is failing. Thank you.
int sock;
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("error opening socket");
}
EDIT: Also, printing out strerror(errno) simply shows "No error".
回答1:
You need to call WSAStartup()
before any other socket functions will work on Windows (and you're supposed to call WSACleanup()
when you're done).
回答2:
Jerry Coffin is right about WSAStartup()
and WSACleanup()
.
Also note that this code
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
is problematic because SOCKET
is an unsigned type (unsigned int
).
From winsock.h
/*
* This is used instead of -1, since the
* SOCKET type is unsigned.
*/
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1)
So, IMO it's better to replace that line with
if( INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, 0)) )
even if it's not the root cause.
回答3:
An Example:
#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;
}
来源:https://stackoverflow.com/questions/2004307/cant-create-socket-on-windows