簡體   English   中英

使用Matlab的C ++中的Performance Windows Socket

[英]Performance Windows Socket in C++ with Matlab

我正在嘗試創建一個將數據從C ++程序發送到Matlab另一個程序的應用程序。 數據的大小在1000Hz時約為100倍,並且在達到該頻率時遇到問題(即使在本地主機中)。

使用套接字的默認參數,我得到〜100Hz。 我也嘗試將值TCP_NODELAY設置為false,但這會使情況變得更糟。 處理器為i7-2600 @ 3.4 Hz,因此請確保這不是問題。 另外,目前我對數據所做的唯一處理就是保存它,因此還有一個耗時的過程。

另外,我確信可以達到1000 Hz,因為如果刪除send命令,則輸出文件的頻率> 1000 Hz。

初始化代碼:

ConnectSocket = INVALID_SOCKET;
// Initialize Winsock
WSADATA wsaData;
struct addrinfo *result = NULL,
            *ptr = NULL,
            hints;
int iResult;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed with error: %d\n", iResult);
}

ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

// Resolve the server address and port
iResult = getaddrinfo("localhost", DEFAULT_PORT, &hints, &result);
if ( iResult != 0 ) {
    printf("getaddrinfo failed with error: %d\n", iResult);
    WSACleanup();
}
// Attempt to connect to an address until one succeeds
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
    }

    // Connect to server.
    iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR) {
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;
        continue;
    }
    break;
}

freeaddrinfo(result);

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

主要(或完全)從Microsoft網頁復制。 對於發送功能,我們有:

if (RecordingFlag){
            packet[51]=values[35];
            packet[52]=numchDAQ;
            for (i=0;i<values[35];i++){
                fprintf(file,"%.3lf,",values[i]);
                packet[i] =(double)values[i];
            }
            //DAQ
            if (numchDAQ >0){
                DAQmxReadAnalogF64(taskHandle,1,10.0,DAQmx_Val_GroupByChannel,data,16,&read,NULL);
                for(i=0;i<numchDAQ;i++){
                    fprintf(file,"%.3lf,",data[i]);
                    packet[(int)packet[51]+i]=(double)data[i];
                }
            }
            //Timestamp
            GetSystemTime(&st);
            SystemTimeToFileTime(&st,&ft);
            diftime= ((((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime)/10000 - MSEC_TO_UNIX_EPOCH;
            fprintf(file,"%llu",diftime);
packet[0]=prueba;
prueba++;
            send( ConnectSocket, (const char*)packet, sizeof(double)*53, 0 );
            fprintf(file,"\n"); 
        }

該功能稱為每秒1000次。 我想問題是Windows不能這么快地創建套接字,因為它正在等待服務器的ACK。 但是同樣,Matlab中的服務器也非常簡單:

    import java.net.ServerSocket
    import java.io.*
    j=1;
    i=0;
    server_socket  = [];
    input_socket  = [];
    dataByte = int8(zeros (1,424));
    dataDouble = zeros(10000,53);
    while (1)
        try 
            i= i+1;
            fprintf(1, 'Trying to connect %d\n',i);
            server_socket = ServerSocket(31415);
            server_socket.setSoTimeout(5000); 
            input_socket = server_socket.accept;
            fprintf(1, 'Client connected\n');
            while (1)
                input_stream   = input_socket.getInputStream;
                d_input_stream = DataInputStream(input_stream);
                bytes_available = input_stream.available;
                while(bytes_available>0 && j<10000)
                    %fprintf(1, 'Reading %d bytes\n', bytes_available);
                    for i =1:424
                        dataByte(i)= d_input_stream.readByte;
                        bytes_available = bytes_available-1;
                    end
                    dataDouble(j,:) = typecast(dataByte,'double');
                    j=j+1;
                end
            end

            % cleanup
            input_socket.close;
        catch
            if ~isempty(server_socket)
                server_socket.close;
            end

            if ~isempty(input_socket)
                input_socket.close
            end

            % pause before retrying
            %pause(1);
        end
   end

即使沒有進行類型轉換,我也會得到相同的結果。

關於如何解決這個問題的任何想法?

編輯:問題是在Matlab中,它讀取信息太慢。 我更改了代碼,現在可以完美地運行while(bytes_available> 0 && j <1000)d_input_stream.read(dataByte,0,424); bytes_available = bytes_available-424; dataDouble(j,:) = typecast(dataByte,'double'); j = j + 1; 結束

問題出在Matlab上,它讀取信息的速度太慢。 我更改了代碼,現在可以正常使用

while(bytes_available>0 && j<1000)
    d_input_stream.read(dataByte,0,424);
    bytes_available = bytes_available-424;
    dataDouble(j,:) = typecast(dataByte,'double');
    j=j+1;
end

–普里克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM