0

こんにちは、私は初心者のソケット/C プログラマーです。このチュートリアルから、connect 関数が 10038 エラーを返します。助けてください。私は何を間違っていますか?
また、winsock と winsock2 の違いは何ですか? connect() 関数定義にも int PASCAL がありますが、パスカルとは何ですか?

#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;
}
4

1 に答える 1

3

10038の意味するドキュメントを確認する必要があります。

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

したがってsa、ソケットではありません。に出力saするとcerr、それがゼロであることが示されるため、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のv1.1であり、winsock2(ws2_32.dll)は多くの改善が加えられた2番目のバージョンです。Win98以降はWindowsの一部であるため(Win95ではダウンロード可能)、少なくともwinsock2を使用することをお勧めします。
  • PASCALは˙のマクロです__stdcall。WindowsAPI関数は通常、この呼び出し規約を使用します。
于 2013-01-12T13:49:18.147 に答える