0

私はネットワークに非常に慣れておらず、whileループ中にメッセージを送信する際に問題があります。

私の知る限り、私はこれに沿って何かをすべきです:

Create Socket()
Connect()

While
     Do logic
     Send()
End while

Close Socket()

ただし、1回送信し、その後-1を返します。

このコードは、ループ内にソケットを作成した場合にのみ機能します。

While
     Create Socket()
     Connect()
     Do logic
     Send()
     Close Socket()
End while

これが私が使用しているコードのセクションですが、機能しません:

//init winsock
WSAStartup(MAKEWORD(2, 0), &wsaData);

//open socket
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    //connect
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family      = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
    serveraddr.sin_port        = htons((unsigned short) port);
    connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr));

while(true) {

    if (send(sock, request.c_str(), request.length(), 0)< 0 /*!= request.length()*/) {
        OutputDebugString(TEXT("Failed to send."));
    } else {
        OutputDebugString(TEXT("Activity sent."));
    }
    Sleep(30000);
}
//disconnect
closesocket(sock);

//cleanup
WSACleanup();

関数CheckForLastError()は10053を返します

WSAECONNABORTEDソフトウェアにより接続が異常終了しました。確立された接続は、おそらくデータ送信のタイムアウトまたはプロトコルエラーが原因で、ホストコンピューターのソフトウェアによって中止されました

ありがとう

4

2 に答える 2

-2

プログラムが失敗する方法と理由を理解するには、使用する関数を理解する必要があります。それらのいくつかはブロック機能であり、いくつかはそうではありません。それらの中には、他の関数の以前の呼び出しが必要なものもあれば、そうでないものもあります。私が理解していることから、ここではサーバーではなくクライアントについて話している. この場合、クライアントにはノンブロッキング機能しかありません。つまり、関数を呼び出すたびに、待機せずに実行されます。そのため、send() は呼び出された瞬間にデータを送信し、ストリームは次のコード行に進みます。送信する情報がまだ準備されていない場合は、何も送信されないため、問題が発生します。それを解決するには、ある種の遅延を使用できます。遅延の問題は、遅延に達するとストリームが停止することを意味するブロッキング関数であることです。これを解決するには、スレッドを作成し、情報を送信する準備が整うまでスレッドをロックします。しかし、それは 1 つの send() の仕事をします。あなたは情報を送信し、それだけです。通信を保留して繰り返し情報を送信したい場合は、while ループを作成する必要があります。while ループができたら、何も心配する必要はありません。これは、ストリーム コントロールで情報の準備ができていることを確認でき、接続を終了する前に send を何度も使用できるためです。問題は、サーバー側で何が起こっているのかということです。「ipaddress」には、サーバーの IP を保持する必要があります。サーバーはあなたの接続要求を拒否するかもしれません。最悪の場合、サーバーはあなたの要求を受け入れても、クライアントとは異なる設定でリッスンしている可能性があります。

于 2013-04-21T09:13:50.723 に答える