0

私はソケットを介してSQL Serverに接続しようと何日も試みてきました。何が悪いのかわかりません。

私は自分のSQLサーバーを正しくセットアップしたと思います。ソケットで使用しているのと同じ接続情報を使用して、サーバーマネージャーまたはVisual Studioから接続できます。いつでも動作しますが、ソケットを使用します。ソケットは接続できますが、サーバーに文字列を送信すると、SQL Server ログに次のように表示されます。 17インチ。

これが私が使用するソケットコードです。Microsoft ソケット サーバー/クライアントの例から取得しました。

#include "stdafx.h"

#include "ClientMFC.h"

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")



using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;
        }
        else
        {
            // TODO: code your application's behavior here.
        }
    }
    else
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    }
    //WSADATA is a struct that is filled up by the call 
    //to WSAStartup
    WSADATA wsaData;


    //WSAStartup initializes the program for calling WinSock.
    //The first parameter specifies the highest version of the 
    //WinSock specification, the program is allowed to use.
    int wsaret=WSAStartup(0x101,&wsaData);

    //WSAStartup returns zero on success.
    //If it fails we exit.
    if(wsaret!=0)
    {
        return 0;
    }

    SOCKET ConnectSocket = INVALID_SOCKET;

    struct sockaddr_in dest_addr;   // will hold the destination addr  

    dest_addr.sin_family = AF_INET;          // host byte order
    dest_addr.sin_port = htons(2433);   // short, network byte order
    dest_addr.sin_addr.s_addr = inet_addr("10.100.17.114");
    memset(&(dest_addr.sin_zero), '\0', 8);  // zero the rest of the struct
    ConnectSocket = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!


   // Connect to server.
    int iResult = connect( ConnectSocket, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
    if (iResult == SOCKET_ERROR) {
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;
    }

    const char *   toto   = "<connectionString>Data Source=10.100.17.114,2433;ENCRYPT=false;Initial Catalog=MetricsLocal;Persist Security Info=True;User ID=sa;Password=XXX</connectionString>";

    char *SendBuf = (char*)malloc(strlen(toto) * sizeof(char));
    // convert to network byte ordering. This is important for running on the ps3 and xenon
    for(INT BufIndex = 0; BufIndex < strlen(toto); ++BufIndex)
    {
        SendBuf[BufIndex] = toto[BufIndex];//htons(toto[BufIndex]);
    }


    int BytesSent           = send(ConnectSocket, SendBuf , strlen(SendBuf),0);

    printf("BytesSent = %d, Supposed = %d\n", BytesSent, strlen(toto));


    if (ConnectSocket == INVALID_SOCKET) {
        printf("Unable to connect to server!\n");
        WSACleanup();
        return 1;
    }


    return nRetCode;
}

パスワードを隠していることに注意してください。このコードは、試すのが本当に簡単なはずです。リンカーの追加の依存関係に ws2_32.lib を追加するだけです。私は本当にこれで立ち往生しています。私はサイズが正しいと確信しています。また、ソケットサーバーをコーディングして、受信したものを確認しましたが、正しいようです。アイデア: - どこにも記述されていないヘッダーが必要ですか? -どこかで行う特別な設定はありますか? 私の telnet 接続は、ポートが開いて準備ができていることを示しています.<

ご協力ありがとうございました

4

0 に答える 0