Can't create socket on Windows

99封情书 提交于 2020-08-22 05:05:06

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!