2010-01-05 40 views
8

Tôi có một vấn đề khá đáng xấu hổ. Mã sau đây sẽ không tạo ổ cắm trên Windows; nó không thành công và hiển thị thông báo lỗi. Bất cứ ai có thể giải thích ngắn gọn tại sao điều này có thể? Tôi vô cùng bối rối và thất vọng vì điều gì đó đơn giản đến nỗi thất bại. Cảm ơn bạn.Không thể tạo ổ cắm trên Windows

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

EDIT: Ngoài ra, in ra strerror (errno) chỉ đơn giản là hiển thị "Không có lỗi".

Trả lời

11

Bạn cần gọi WSAStartup() trước khi bất kỳ chức năng ổ cắm nào khác hoạt động trên Windows (và bạn phải gọi WSACleanup() khi bạn đã hoàn tất).

+0

Cảm ơn bạn ... bằng cách nào đó tôi đã nhận được winsock để làm việc mọi thời đại này mà không cần sử dụng chức năng đó. Rất lạ. –

+0

Bạn có thể thường sử dụng một số thành phần khác cần sử dụng ổ cắm và đang khởi động cho bạn ... –

2

Jerry Coffin là đúng về WSAStartup()WSACleanup().

Cũng lưu ý rằng mã này

if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 

là vấn đề vì SOCKET là một loại unsigned (unsigned int).

Từ winsock.h

/* 
* This is used instead of -1, since the 
* SOCKET type is unsigned. 
*/ 
#define INVALID_SOCKET (SOCKET)(~0) 
#define SOCKET_ERROR   (-1) 

Vì vậy, IMO nó tốt hơn để thay thế dòng đó với

if(INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, 0))) 

ngay cả khi nó không phải là nguyên nhân gốc rễ.

2

Một thí dụ:

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

cho mã sản xuất, đừng quên 'WSACleanup(); ' – Wolf

+0

@Wolf cảm ơn bạn đã đề xuất. Đánh giá cao. –

Các vấn đề liên quan