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