📄 cmd9118.c
字号:
SOL_SOCKET,
SO_REUSEADDR,
(char *)&on,
sizeof(on))==SOCKET_ERROR)
{
printf("Error: SO_REUSEADDR\n");
exit(1);
}
if(bind(server_control,server,sockaddr_len)==SOCKET_ERROR)
{
printf("Error binding the socket\n");
exit(1);
}
if(listen(server_control,5)==SOCKET_ERROR)
{
printf("Error listening\n");
exit(1);
}
switch(fork()) {
case -1:
printf("Error on fork\n");
exit(1);
case 0:
fclose(stdin);
fclose(stderr);
setsid();
for(;;)
{
if((server_sock=accept(server_control,
&peeraddr,
&sockaddr_len)) == INVALID_SOCKET)
{
printf("Error accept failed\n");
exit(1);
}
switch(fork()) {
case -1:
//something went wrong
exit(1);
case 0:
//we are the child process
close(server_control);
process_requests(commandData);
close(server_sock);
exit(0);
break;
default:
//we are the parent process
close(server_sock);
break;
}
}
break;
default:
exit(0);
}
}
bool ReceiveFlowParams(SOCKET sock,PFLOW_PARAMS flowParams)
{
bool result=false;
if(SendULong(sock,COMMAND_GET_FLOW_PARAMS)) {
unsigned long data=0;
if(!ReceiveULong(sock,&data)) goto DONE;
if(data) {
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->MeasuredMaxThroughput=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->MeasuredMaxPacketCount=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->MaxThroughput=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->MaxPacketCount=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->PacketCost=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->BurstPeriod=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->MaxWorkLoad=data;
if(!ReceiveULong(sock,&data)) goto DONE;
flowParams->IntDeas=data;
result=true;
}
}
DONE:
return result;
}
bool SendFlowParams(SOCKET sock,PFLOW_PARAMS flowParams)
{
bool result=false;
unsigned long timeout=100;
unsigned long data=0;
AGAIN:
SendULong(sock,COMMAND_SET_FLOW_PARAMS);
SendULong(sock,flowParams->MeasuredMaxThroughput);
SendULong(sock,flowParams->MeasuredMaxPacketCount);
SendULong(sock,flowParams->MaxThroughput);
SendULong(sock,flowParams->MaxPacketCount);
SendULong(sock,flowParams->PacketCost);
SendULong(sock,flowParams->BurstPeriod);
SendULong(sock,flowParams->MaxWorkLoad);
SendULong(sock,flowParams->IntDeas);
if(ReceiveULong(sock,&data)) {
if(data) {
result=true;
} else {
//If flow control was active this command will fail
// therefore wait and try again later.
if(timeout>0) {
timeout--;
sleep(5);
goto AGAIN;
}
}
}
return result;
}
void DisplayFlowParams(PFLOW_PARAMS flowParams)
{
printf("Flow Control Parameters\n");
printf(" MaxThroughput = 0x%08lX\n",flowParams->MaxThroughput);
printf(" MaxPacketCount = 0x%08lX\n",flowParams->MaxPacketCount);
printf(" PacketCost = 0x%08lX\n",flowParams->PacketCost);
printf(" BurstPeriod = 0x%08lX\n",flowParams->BurstPeriod);
printf(" IntDeas = 0x%08lX\n",flowParams->IntDeas);
}
unsigned long ReadThroughput(char * fileName)
{
unsigned long result=0;
bool clearFlag=true;
FILE * filePtr=NULL;
filePtr=fopen(fileName,"r");
if(filePtr!=NULL) {
char ch=0;
while(fread(&ch,1,1,filePtr)!=0) {
switch(ch) {
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
if(clearFlag) {
result=0;
clearFlag=false;
}
result*=10;
result+=(unsigned long)(ch-'0');
break;
case '.':
break;
default:
clearFlag=true;
break;
}
}
fclose(filePtr);
} else {
printf("ReadThroughput: unable to open file\n");
}
return result;
}
void RunTuner(const char *hostName,unsigned short portNum)
{
SOCKET controlSocket=INVALID_SOCKET;
struct sockaddr_in server;
unsigned int addr;
char command[128];
char outputFile[]="npout.txt";
FLOW_PARAMS flowParams;
FLOW_PARAMS origParams;
FLOW_PARAMS bestParams;
unsigned long bestMeasurement=0;
unsigned long currentSetting=0;
unsigned long currentMeasurement=0;
unsigned long tempLow=0;
unsigned long tempHigh=0;
int salen;
memset((char *)&server,0,sizeof(server));
if(portNum==0) {
portNum=DEFAULT_PORT_NUMBER;
}
server.sin_port=htons(portNum);
if((addr=inet_addr(hostName))==0xFFFFFFFFUL) {
printf("Invalid: hostName==\"%s\"",hostName);
printf(" must be in IP form\n");
return;
} else {
server.sin_addr.s_addr=addr;
server.sin_family=AF_INET;
}
salen=sizeof(server);
controlSocket=socket(AF_INET,SOCK_STREAM,0);
if(controlSocket==INVALID_SOCKET) {
printf("error creating control socket\n");
return;
}
if(connect(controlSocket,
(struct sockaddr *)&server,
salen) == INVALID_SOCKET)
{
printf("failed to connect to %s:%d\n",hostName,portNum);
goto DONE;
}
if(!ReceiveFlowParams(controlSocket,&origParams)) goto FAILED;
memcpy(&bestParams,&origParams,sizeof(FLOW_PARAMS));
bestParams.MeasuredMaxThroughput=0;
bestParams.MeasuredMaxPacketCount=0;
bestParams.MaxThroughput=0;
bestParams.MaxPacketCount=0;
bestParams.BurstPeriod=100;
bestParams.MaxWorkLoad=0;
bestParams.IntDeas=0;
memcpy(&flowParams,&bestParams,sizeof(FLOW_PARAMS));
printf("Entire tuning process will take about one hour.\n");
printf("TUNING IntDeas\n");
sprintf(command,"./netperf -H%s > %s",hostName,outputFile);
bestMeasurement=0;
for(currentSetting=0;currentSetting<80;currentSetting++) {
flowParams.IntDeas=currentSetting;
if(!SendFlowParams(controlSocket,&flowParams)) {
printf("Failed to send new setting: IntDeas=%ld\n",currentSetting);
goto FAILED;
}
if(system(command)==0) {
currentMeasurement=ReadThroughput(outputFile);
if(currentMeasurement>bestMeasurement) {
bestMeasurement=currentMeasurement;
bestParams.IntDeas=currentSetting;
}
} else {
printf("Failed system command: \"%s\"\n",command);
goto FAILED;
}
printf("IntDeas = %ld, Throughput = %ld\n",currentSetting,currentMeasurement);
}
printf("Best: IntDeas = %ld, Throughput = %ld\n",bestParams.IntDeas,bestMeasurement);
flowParams.IntDeas=bestParams.IntDeas;
if(!SendFlowParams(controlSocket,&flowParams)) {
goto FAILED;
}
//getting the FlowParams back will make sure the measurements are clear.
if(!ReceiveFlowParams(controlSocket,&flowParams)) goto FAILED;
if(flowParams.IntDeas!=bestParams.IntDeas) {
printf("new setting did not stick\n");
goto FAILED;
}
printf("Measuring Max Throughput, and Max Packet Count\n");
if(system(command)!=0) goto FAILED;
if(system(command)!=0) goto FAILED;
if(system(command)!=0) goto FAILED;
if(!ReceiveFlowParams(controlSocket,&flowParams)) goto FAILED;
bestParams.MeasuredMaxThroughput=flowParams.MeasuredMaxThroughput;
bestParams.MeasuredMaxPacketCount=flowParams.MeasuredMaxPacketCount;
bestParams.MaxThroughput=bestParams.MeasuredMaxThroughput;
bestParams.MaxPacketCount=bestParams.MeasuredMaxPacketCount;
bestParams.PacketCost=0;
bestParams.MaxWorkLoad=0xFFFFFFFFUL;
bestParams.BurstPeriod=100;
memcpy(&flowParams,&bestParams,sizeof(FLOW_PARAMS));
printf("TUNING Burst Period\n");
sprintf(command,"./netperf -H%s -tUDP_STREAM -l10 -- -m1472 > %s",
hostName,outputFile);
bestMeasurement=0;
for(currentSetting=10;currentSetting<120;currentSetting++) {
flowParams.BurstPeriod=currentSetting;
if(!SendFlowParams(controlSocket,&flowParams)) {
printf("Failed to send new setting: BurstPeriod=%ld\n",currentSetting);
goto FAILED;
}
if(system(command)==0) {
currentMeasurement=ReadThroughput(outputFile);
if(currentMeasurement>bestMeasurement) {
bestMeasurement=currentMeasurement;
bestParams.BurstPeriod=currentSetting;
}
} else {
printf("Failed system command: \"%s\"\n",command);
goto FAILED;
}
printf("BurstPeriod = %ld, Throughput = %ld\n",
currentSetting,currentMeasurement);
}
printf("Best: BurstPeriod = %ld, Throughput = %ld\n",
bestParams.BurstPeriod,bestMeasurement);
flowParams.BurstPeriod=bestParams.BurstPeriod;
printf("TUNING PacketCost\n");
sprintf(command,"./netperf -H%s -tUDP_STREAM -l10 -- -m16 > %s",
hostName,outputFile);
bestMeasurement=0;
for(currentSetting=0;currentSetting<500;currentSetting+=10) {
flowParams.PacketCost=currentSetting;
if(!SendFlowParams(controlSocket, &flowParams)) {
printf("Failed to send new setting: PacketCost=%ld\n",currentSetting);
goto FAILED;
}
if(system(command)==0) {
currentMeasurement=ReadThroughput(outputFile);
if(currentMeasurement>bestMeasurement) {
bestMeasurement=currentMeasurement;
bestParams.PacketCost=currentSetting;
}
} else {
printf("Failed system command: \"%s\"\n",command);
goto FAILED;
}
printf("PacketCost = %ld, Throughput = %ld\n",
currentSetting,currentMeasurement);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -