Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的Windows套接字性能+;用Matlab 我试图创建一个应用程序,它将数据从C++程序发送到另一个MATLAB程序中。 数据大小约为100倍@1000Hz,我在达到该频率时遇到问题(即使在本地主机中)_C++_Performance_Matlab_Sockets - Fatal编程技术网

C+中的Windows套接字性能+;用Matlab 我试图创建一个应用程序,它将数据从C++程序发送到另一个MATLAB程序中。 数据大小约为100倍@1000Hz,我在达到该频率时遇到问题(即使在本地主机中)

C+中的Windows套接字性能+;用Matlab 我试图创建一个应用程序,它将数据从C++程序发送到另一个MATLAB程序中。 数据大小约为100倍@1000Hz,我在达到该频率时遇到问题(即使在本地主机中),c++,performance,matlab,sockets,C++,Performance,Matlab,Sockets,使用插座的默认参数,我得到~100Hz。我还尝试将值TCP_NODELAY设置为false,但这会使情况变得更糟。处理器是i7-2600@3.4 Hz,因此可以肯定这不是问题所在。目前,我对数据的唯一处理是保存数据,所以这也是一个耗时的过程 另外,我确信我可以达到1000赫兹,因为如果我删除send命令,输出文件的频率就大于1000赫兹 初始化代码: ConnectSocket = INVALID_SOCKET; // Initialize Winsock WSADATA wsaData; st

使用插座的默认参数,我得到~100Hz。我还尝试将值TCP_NODELAY设置为false,但这会使情况变得更糟。处理器是i7-2600@3.4 Hz,因此可以肯定这不是问题所在。目前,我对数据的唯一处理是保存数据,所以这也是一个耗时的过程

另外,我确信我可以达到1000赫兹,因为如果我删除send命令,输出文件的频率就大于1000赫兹

初始化代码:

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"); 
        }
if(记录标志){
数据包[51]=值[35];
数据包[52]=numchDAQ;
对于(i=0;i0){
DAQmxReadAnalogF64(任务句柄,1,10.0,DAQmx_Val_GroupByChannel,数据,16,&read,NULL);

对于(i=0;i问题出在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

while(bytes\u available>0&&j您不想尝试每秒创建1000个套接字。只需创建一个套接字并保持其打开,同时在其上传输数据。我错误地表达了我自己。我没有创建1000个套接字。我创建一个套接字并尝试每秒发送1000个数据包。
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