hallo,
ich beschäftige mich seit kurzem mit der netzwerkprogramierung in c++
leider weis ich nich ob das hier hin gehört oder ins netzwerk topic sry.
ich habe mir jetz einen kleinen "monitor" geschrieben der es mir ermöglichen soll ohne ständig mit dem putty auf den raspy connecten zu müssen dessen status zu checken
das funktioniert auch zeitweise
doch dann stürtzt der client auf dem windows system ab und der server auf dem raspi schreibt speicherzugriffsfehler
habe ich irgendwo einen pointer falsch gesetzt oder irgendwas übersehen ?
anbei nochmal das ganze gezipt
schonmal vielen dank für jeden hin:thumbs1:
also das hier ist der code vom server :
C
#include "include/server_tcp.h"
#include <iostream>
#include <stdio.h>
using namespace std;
void wait(const float& ms)
{
#ifdef linux
sleep((ms/100));
#else
Sleep(ms);
#endif // linux
}
void status(char *data,char *befehl);
int main()
{
SERVER my;
int client =0,
wTime =100;
char temp[30],
clock[30],
volt[30];
my.init(12345);
listen(my.sockID,2);
while(true)
{
client=accept(my.sockID,0,0);
while(client)
{
status(temp,"vcgencmd measure_temp");
if(send(client,temp,30,0)==-1)
{
break;
}
wait(wTime);
status(clock,"vcgencmd measure_clock arm");
if(send(client,clock,30,0)==-1)
{
break;
}
wait(wTime);
status(volt,"vcgencmd measure_volts");
if(send(client,volt,30,0)==-1)
{
break;
}
wait(wTime);
}
close(client);
}
my.clean();
}
void status(char *data,char *befehl)
{
FILE *fp;
fp = popen(befehl,"r");
fgets(data,30,fp);
}
Alles anzeigen
und dies ist der code vom client :
C
#include <iostream>
#include "include/client_tcp.h"
#include "include/str_change.h"
#include <windows.h>
/**
Attribute Meaning
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.
COMMON_LVB_LEADING_BYTE Leading byte.
COMMON_LVB_TRAILING_BYTE Trailing byte.
COMMON_LVB_GRID_HORIZONTAL Top horizontal.
COMMON_LVB_GRID_LVERTICAL Left vertical.
COMMON_LVB_GRID_RVERTICAL Right vertical.
COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE Underscore.
*/
#define KRITISCH FOREGROUND_RED|FOREGROUND_INTENSITY
#define NORMAL FOREGROUND_GREEN|FOREGROUND_INTENSITY
#define BESSER FOREGROUND_BLUE|FOREGROUND_INTENSITY
#define ERROR BACKGROUND_RED|BACKGROUND_INTENSITY
WORD SetColor(WORD new_color)
{
WORD old_color=0;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdOut,&csbi);
old_color = csbi.wAttributes;
SetConsoleTextAttribute(hStdOut,new_color);
return old_color;
}
using namespace std;
int main()
{
char temp[256],
clock[256],
volts[256],
IP[15];
bool verbunden=true;
float fTemp=0,
fVolts=0;
double dClock=0,
zahl=0;
WORD defColor=0;
CLIENT MyClient;
cout<<"Bitte Server IP angeben :";
cin >>IP;
cout<<IP<<endl;
MyClient.init(IP,12345);
while(verbunden)
{
if( recv(MyClient.sockID,temp,256,0)==-1||
recv(MyClient.sockID,clock,256,0)==-1||
recv(MyClient.sockID,volts,256,0)==-1)
{
cout<<"recv fehlerhaft"<<endl;
break;
}
cut_befor(temp,'=');
cut_after(temp,((char)39));///char 39 == "'"
fTemp = charToFloat(temp);
cut_befor(clock,'=');
cut_after(clock,'\n');
dClock = charToDouble(clock);
dClock = dClock/10000000;
cut_befor(volts,'=');
cut_after(volts,'V');
fVolts=charToFloat(volts);
system("cls");
cout<<"TEMPERATUR :";
if(fTemp>65.0)
{
defColor=SetColor(KRITISCH);
cout<<fTemp<<endl;
SetColor(defColor);
}
else if(fTemp>50&&fTemp<65.0)
{
defColor=SetColor(NORMAL);
cout<<fTemp<<endl;
SetColor(defColor);
}
else if(fTemp<50)
{
defColor=SetColor(BESSER);
cout<<fTemp<<endl;
SetColor(defColor);
}
else
{
defColor=SetColor(ERROR);
cout<<"FEHLER In temp messung"<<endl;
SetColor(defColor);
}
cout<<"TACKTFREQUENC:";
if(dClock<1000)
cout<<dClock<<" MHz"<<endl;
else if(dClock>=1000)
{
dClock = dClock/1000;
cout<<dClock<<" GHz"<<endl;
}
else
cout<<"FEHLER in clock messung"<<endl;
cout<<"SPANNUNG :";
cout<<fVolts<<" V"<<endl;
zahl++;
cout<<zahl<<". Akt"<<endl;
}
cout<<"ende"<<endl;
MyClient.clean();
}
Alles anzeigen
dazu dann noch die
client_tcp.cpp
Code
#include "../include/client_tcp.h"
bool CLIENT::init(const char* IP, const int& Port)
{
WSAData w;
#ifndef linux
if(WSAStartup(MAKEWORD(2,2),&w)!=0)
{
clean();
return false;
}
#endif // linux
sockID= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sockID==-1)
{
clean();
return false;
}
sockInfo.sin_family =AF_INET;
sockInfo.sin_port =htons(Port);
sockInfo.sin_addr.s_addr =inet_addr(IP);
if(connect(sockID,reinterpret_cast<sockaddr*>(&sockInfo),sizeof(sockInfo))==-1)
{
clean();
return false;
}
return true;
}
void CLIENT::clean()
{
#ifdef linux
close(this->sockID)
#else
closesocket(sockID);
WSACleanup();
#endif // linux
}
Alles anzeigen
und die
str_change.cpp
Code
#include "../include/str_change.h"
float charToFloat(char* c)
{
int zahlenVorPunkt =0,
zahlenNachPunkt =0,
laenge =0,
i_char =0;
float tErgVorPunkt =0.0,
tErgNachPunkt =0.0,
ergebniss =0.0;
bool PunktGefunden =false,
minusZahl =false;
if(c[0]=='-')
{
minusZahl=true;///minus zahlen abfangen!!!
for(laenge; *(c+laenge)!='\0'; laenge++);
for(int i =0; i<laenge; i++)
{
c[i]=c[i+1];
}
c[laenge]='\0';
}
for(laenge=0; *(c+laenge)!='\0'; laenge++)
{
if(PunktGefunden)
{
zahlenNachPunkt++;
}
if(c[laenge]=='.')
{
PunktGefunden=true;
}
if(!PunktGefunden)
{
zahlenVorPunkt++;
}
}
for(int i=0; i<zahlenVorPunkt; i++)
{
i_char = c[i] - (int)'0';
tErgVorPunkt=tErgVorPunkt+ i_char*pow(10,(zahlenVorPunkt-i-1));
}
for(int i=0; i<zahlenNachPunkt; i++)
{
i_char = c[i+(laenge-zahlenNachPunkt)] - (int)'0';
tErgNachPunkt=tErgNachPunkt+ i_char*pow(10,zahlenNachPunkt-i-1);
}
tErgNachPunkt=tErgNachPunkt/pow(10,zahlenNachPunkt);
ergebniss=tErgVorPunkt+tErgNachPunkt;
if(minusZahl)
ergebniss=ergebniss*(-1);
return ergebniss;
}
double charToDouble(char* c)
{
int laenge =0,
i_char =0;
double ergebniss =0;
bool minusZahl =false;
if(c[0]=='-')
{
minusZahl=true;///minus zahlen abfangen!!!
for(laenge; *(c+laenge)!='\0'; laenge++);
for(int i =0; i<laenge; i++)
{
c[i]=c[i+1];
}
c[laenge]='\0';
}
for(laenge=0; c[laenge]!='\0'; laenge++);
for(int i=0; i<laenge; i++)
{
i_char= c[i]-(int)'0';
ergebniss=ergebniss+i_char*pow(10,laenge-i);
}
if(minusZahl)
ergebniss=ergebniss*(-1);
return ergebniss;
}
void cut_befor(char *referenz, char zeichen)
{
int ii=0,
length=0;
bool flag=false;
for(length=0; *(referenz+length)!='\0'; length++);
for(int i=0; i<=length; i++)
{
if(*(referenz+i)==zeichen)
{
flag = true;
i++;
}
if(flag)
{
*(referenz+ii)=*(referenz+i);
ii++;
}
}
}
void cut_after(char* referenz, char zeichen)
{
int i;
for(i=0; *(referenz+i)!=zeichen; i++)
{
*(referenz+i)=*(referenz+i);
}
*(referenz+i)='\0';
}
Alles anzeigen