4

WinXp(i7、2.1 Ghz)で実行されているマスタースレーブアプリケーションマスターとコントローラーボードであるスレーブがあります。マスターはスレーブに要求を送信し、それに応じてスレーブはマスターに周期的にデータを送信します。スレーブによって周期的に送信されるこのデータは、0.5 ミリ秒あたり 1000 バイトです。マスターがデータの送信を要求すると、コンソールにエラーが報告されます。

「 Select() 関数のエラー コード:: 10038」。

のコードですWSAENOTSOCK

このアプリケーションは、スレーブからデータを受信するシングル スレッド アプリケーションです。エラーから、選択機能によってチェックされる前にソケットが閉じられているようです。

誰でも私を方向に向けることができますか?

:::ソースコード::::

int Receive()
{
    int rc;
    socklen_t cli_alen;
    struct timeval to;
    fd_set read_fd, write_fd, excep_fd;

    FD_ZERO(&write_fd);
    FD_ZERO(&excep_fd);

sock_again:
    if (!_isSocketOpen) 
    {
        return 0;
    }
    FD_ZERO(&read_fd);
    FD_SET(_sock_fd, &read_fd);
    to.tv_sec =  0;
    to.tv_usec = 0;
    cli_alen = sizeof(SOCKADDR_IN);

    rc = select(_sock_fd+1, &read_fd, &write_fd, &excep_fd, &to);

    if (rc == 0 )  
    {   // Timeout
        // printf("XCP Port %d : select() timded out \n", _port);
        acess = 1;
        goto sock_again;
    } 
    else if (rc == SOCKET_ERROR) 
    {
        // Error
        LogError("XCP: select() error %d", WSAGetLastError());
        closesocket(_sock_fd);
        return -1;
    }
    else 
    {
        // Data
        if (!FD_ISSET(_sock_fd, &read_fd)) 
        {
            LogError("XCP: select() wrong socket descr");
            return -1;
        }
        else
        {
            //read data
            rc = recvfrom(_sock_fd, (char *)_recvBuf, UDP_RECVBUFLEN, 0, (LPSOCKADDR)&_saddr, &cli_alen);
}
}
}

:::: 編集済み ::::

int CloseUdpConnection()
{
    if (closesocket(_sock_fd) == SOCKET_ERROR) {
        LogError("closesocket() error: %d", WSAGetLastError());
        return -1;
    }
    _isSocketOpen = 0;
    LogError("successfully closed socket %s:%d", _address, _port);
    return 0;
}

::::: デバッグ トレース :::::

xcpApplication.exe -i 192.168.1.100 -p 5555
c
--> Connecting...
<-- Connection established
t
--> Setting daq signal list...
Sorting daq signal list...
Sorting done
<-- Daq signal list set
d
--> Configuring daq lists...
<-- Configuration done
r
--> Starting measurement...
<-- Measurement started

**_sock_fd: -448997078**
XCP: select() error 10038

::::: 痕跡 ::::

--> Starting measurement...
<-- Measurement started
_sock_fd: -1963260928 
_sock_fd: 0x8afb0400
XCP: select() error 10038

:::::: 痕跡 ::::

xcpApplication.exe -i 192.168.1.100 -p 5555

_sock_fd: 1936 _sock_fd: 0x790
successfully opened socket 192.168.1.100:5555

--> Connecting...
<-- Connection established
t
--> Setting daq signal list...
Sorting daq signal list...
Sorting done
<-- Daq signal list set
d
--> Configuring daq lists...
<-- Configuration done
c
--> Connecting...
<-- Connection established
r
--> Starting measurement...
<-- Measurement started
_sock_fd: 901186560 _sock_fd: 0x35b70400
XCP: select() error 10038
4

1 に答える 1

6
>net helpmsg 10038

An operation was attempted on something that is not a socket.

関数を使用して、TCP/IP の意味で安全にソケットを閉じることができshutdown()ます。ただし、またはで使用されclosesocket()ているSOCKETハンドルを呼び出さないでください。select()poll()

実際、Win32 では通常、代わりにWSAAsyncSelectorを使用することを好みます。WSAEventSelect

アプリケーションがシングルスレッドで、非同期コールバックを使用しない場合、呼び出しclosesocket中にselect呼び出すことはできません。そして、あなたは を呼び出した後、すぐに戻ってくるようclosesocketです。したがって、無効なソケットを使用して関数を入力する必要がありますが、_isSocketOpenそうです。おそらく、 を呼び出すときにそのフラグを false に設定する必要がありますclosesocket()

于 2013-03-19T15:54:17.243 に答える