2013-01-12 281 views
0

你好,我是一個初學socket/c程序員,從這個教程我有連接函數返回10038錯誤。請幫忙。我究竟做錯了什麼?
還有什麼區別winsock和winsock2? 也在connect()函數中定義了int PASCAL pascal是什麼?連接()函數失敗wsagetlasterror()10038

#include <iostream> 
#include <winsock.h> 


using namespace std; 

int main(){ 

    WSADATA wsa; 
    cout<< "Iinitializing winsock...."; 
    SOCKET sa; 
    struct sockaddr_in server; 

     if (WSAStartup(MAKEWORD(2,2), &wsa)!=0) 
      cout << "Failed"; 

    cout << "initialized"; 


     if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)) 
      cout << "Could not create socket " << WSAGetLastError(); 

    cout << "Socket created"; 

    server.sin_addr.s_addr = inet_addr ("213.165.64.44"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(7); 

    //connect 
     if (connect(sa, (struct sockaddr *)&server, sizeof(server)) < 0){ 
      cerr << "connect error" << WSAGetLastError(); 
      return 1; 
     } 
    cout << "connected"; 




return 0; 
} 

回答

3

你應該看看文檔什麼意思10038:

WSAENOTSOCK 
10038 (0x2736) 
An operation was attempted on something that is not a socket. 

所以sa不是一個套接字。打印出sacerr表明它爲零,因此調用socket()函數時出現的問題很糟糕。在該行更仔細地觀察發現,存在於線括號錯誤:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)) 

的==首先執行,並作爲socket()函數的返回值不是無效的套接字,零被分配給SA 。 正確的表達將是:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 

對於問題的其它部分:

  • Winsock的(WINSOCK.DLL)是API,Winsock2的(ws2_32.dll中)的1.1版是第二個版本有很多改進。由於它是Win98以來的一部分(可以從Win95下載),我推薦至少使用winsock2。
  • PASCAL是一個用於__stdcall˙的宏,Windows API函數一般使用這個calling convention
+0

+1爲您的答案 - 我永遠不會看到如此密切的困擾。 -1爲OP問題的廢話調試技能 - 沒有讀取到本地的第一個套接字,以便它的返回值可以被檢查。對不起,OP,但本網站上顯示的調試技巧的水平是非常糟糕的,而且越來越差...... –

+0

所以你告訴我,當你自己沒有發現它時,我的調試技巧不好。順便說一句,我沒有用wsagetlasterror查找錯誤代碼。我只是不知道是什麼造成了它。 –

+0

你還會推薦什麼IDE?我目前正在使用code :: blocks,我應該改變IDE嗎? –