2013-01-12 248 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吗? –