OUTDATED
Das Problem hat sich (von selbst) gelöst...
Also, ich habe ein kleines (eher großes) Problem:
Mein Programm soll auf einem Port (4300) einen Broadcast senden und dann antowrte auf den gleichen Port empfangen und dann interpretieren. Der Broadcast geht weg (kommt auch bei dem Test-Proggi an), aber nachdem ich den gleichen Socket bind-e und den blocking-Befehl receivefrom() aufrufe, kommt nicht an, auch wenn der Test-Programm sein packet vollständig versandt hatte. Ich weiß schon, dass es KEINE Garantie gibt, dass die einzelnen Packete ankommen, doch ein 100% Verlust ist schon verwunderlich, vor allem, weil es ohne dem Braodcast wurdevoll funktioniert hatte
Das Haupt-programm:
Der Code des Test-Proggies:
Na gut, ich hoffe all das genügt...
Wenn jemand im volständigen Code interessier ist, bitte pn an mich und ich schicke sie ihm.
Auch wenn es vielleicht so aussieht, DIES IST KEIN Trojaner, sondern der Dienst-Teil eines Serverlosen Chatsystems. Der Dienst versendet einen "Hi, I'm here" und die restlichen Chatproggies, die online sind, registrieren es und sendem ihm eine Antwort? la "Hi, Ich bin 123.123.123.1, meine ID ist 1234".
Hoffentlich weiß jemand ne Antwort drauf, weil ich habe jetzt ca. 1 Woche dran rumgetüftelt und habe keine Lösung gefunden (keine die mir wirklich taugt
)
MfG
Mobius
Das Problem hat sich (von selbst) gelöst...
Also, ich habe ein kleines (eher großes) Problem:
Mein Programm soll auf einem Port (4300) einen Broadcast senden und dann antowrte auf den gleichen Port empfangen und dann interpretieren. Der Broadcast geht weg (kommt auch bei dem Test-Proggi an), aber nachdem ich den gleichen Socket bind-e und den blocking-Befehl receivefrom() aufrufe, kommt nicht an, auch wenn der Test-Programm sein packet vollständig versandt hatte. Ich weiß schon, dass es KEINE Garantie gibt, dass die einzelnen Packete ankommen, doch ein 100% Verlust ist schon verwunderlich, vor allem, weil es ohne dem Braodcast wurdevoll funktioniert hatte

Das Haupt-programm:
Code:
//create all the needed stuff
SOCKET receiver, sender, broadcaster;
int broadcast=1;
int ret=0;
int size=0;
char buffer[540];
SOCKADDR_IN addr, rem_addr;
memset(&rem_addr,0,sizeof(rem_addr));
//creat the 3 sockets
broadcaster=socket(AF_INET,SOCK_DGRAM,0);
receiver=socket(AF_INET,SOCK_DGRAM,0);
sender=socket(AF_INET,SOCK_DGRAM,0);
if(receiver==INVALID_SOCKET||sender==INVALID_SOCKET||broadcaster==INVALID_SOCKET)
{
error("One of the sockets couldn't be initialised!! Terminating");
error(WSAErr(WSAGetLastError()));
goto end;
}
//set the sockopt for broadcast (is the error here????)
if(setsockopt(broadcaster,SOL_SOCKET,SO_BROADCAST,(char *)&broadcast,sizeof(broadcast))==SOCKET_ERROR)
{
error("The broadcast-setting couldn't been initiated, revew your network settings or ask your administrator, terminating");
error(WSAErr(WSAGetLastError()));
goto end;
}
//get my own adress
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_BROADCAST);
addr.sin_port=htons(S_PORT);
gethostname(buffer,sizeof(buffer));
hostent *me=gethostbyname(buffer);
in_addr *ptr=(in_addr*)me->h_addr;
sprintf(buffer,"hi#%s#%d",inet_ntoa(*ptr),ID);
rem_addr.sin_family=AF_INET;
rem_addr.sin_port=htons(S_PORT);
rem_addr.sin_addr=*ptr;
//send my broadcast!!
int len=sendto(broadcaster,buffer,(int)strlen(buffer),0,(SOCKADDR*)&addr,sizeof(addr));
if(len!=strlen(buffer))
{
error("Broadcast hello couldn't been send in one packet! Review your network settings (buffer size min 540)! Terminating");
}
closesocket(broadcaster);
//bind the receiver socket
addr.sin_addr=*ptr;
if(bind(receiver,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
{
error("Couldn't bind socket to port/adress, look if it isn't in use and restart");
error(WSAErr(WSAGetLastError()));
goto end;
}
while(running)
{
size=sizeof(rem_addr);
//blocking command, but it NEVER returns --> never gets a packet
ret=recvfrom(receiver,buffer,sizeof(buffer)-1,0,(SOCKADDR*)&rem_addr,&size);
if(ret==SOCKET_ERROR)
{
error("Couldn't receive from socket...");
error(WSAErr(WSAGetLastError()));
running=false;
goto end;
}
buffer[ret]=0;
WriteFile(pipe,buffer,(int)strlen(buffer),(LPDWORD)&size,NULL);
if(size!=strlen(buffer))
error("Couldn't write all data into buffer!! Expect errors!!");
if(memcmp(buffer,"hi",2)==0)
{
sprintf(buffer,"me#%s#%d",inet_ntoa(*ptr),time(NULL));
ret=sendto(sender,buffer,(int)strlen(buffer),0,(SOCKADDR*)&rem_addr,sizeof(rem_addr));
if(ret==SOCKET_ERROR)
{
error("Couldn't send to socket...");
error(WSAErr(WSAGetLastError()));
running=false;
goto end;
}
}
}
closesocket(receiver);
closesocket(sender);
Der Code des Test-Proggies:
Code:
WORD wVersionRequested;
WSADATA wsaData;
hostent *me;
SOCKET sock, sender;
SOCKADDR_IN myaddr;
SOCKADDR_IN remoteaddr;
int lenght=sizeof(remoteaddr);
char buffer[540];
int len=0;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData );
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(4300);
gethostname(buffer,sizeof(buffer));
me=gethostbyname(buffer);
myaddr.sin_addr=*(in_addr*)me->h_addr;
sock=socket(AF_INET,SOCK_DGRAM,0);
sender=socket(AF_INET,SOCK_DGRAM,0);
u_long noblock=1;
bind(sock,(SOCKADDR*)&myaddr,sizeof(myaddr));
while(1)
{
WORD wVersionRequested;
WSADATA wsaData;
hostent *me;
SOCKET sock, sender;
SOCKADDR_IN myaddr;
SOCKADDR_IN remoteaddr;
int lenght=sizeof(remoteaddr);
char buffer[540];
int len=0;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData );
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(4300);
gethostname(buffer,sizeof(buffer));
me=gethostbyname(buffer);
myaddr.sin_addr=*(in_addr*)me->h_addr;
sock=socket(AF_INET,SOCK_DGRAM,0);
sender=socket(AF_INET,SOCK_DGRAM,0);
u_long noblock=1;
bind(sock,(SOCKADDR*)&myaddr,sizeof(myaddr));
while(1)
{
//get the broadcast
len=recvfrom(sock,buffer,sizeof(buffer)-1,0,(SOCKADDR*)&remoteaddr,&lenght);
if(len==SOCKET_ERROR)
printf("%s\n",err(WSAGetLastError()));
buffer[len]=0;
printf("%s has send %d bites, %s\n",inet_ntoa(remoteaddr.sin_addr),len,buffer);
strcpy(buffer,"me#123.21.233.12#12342131241234");
closesocket(sock);
Sleep(5000);
[color=red]//hier liegt der Hund (=Fehler) vergraben[/color]
remoteaddr.sin_port=htons(4300);
//send the answer to the broadcaster
len=sendto(sender,buffer,strlen(buffer),0,(SOCKADDR*)&remoteaddr,sizeof(remoteaddr));
if(len==SOCKET_ERROR)
printf("%s\n",err(WSAGetLastError()));
}
return 0;
Na gut, ich hoffe all das genügt...
Wenn jemand im volständigen Code interessier ist, bitte pn an mich und ich schicke sie ihm.
Auch wenn es vielleicht so aussieht, DIES IST KEIN Trojaner, sondern der Dienst-Teil eines Serverlosen Chatsystems. Der Dienst versendet einen "Hi, I'm here" und die restlichen Chatproggies, die online sind, registrieren es und sendem ihm eine Antwort? la "Hi, Ich bin 123.123.123.1, meine ID ist 1234".
Hoffentlich weiß jemand ne Antwort drauf, weil ich habe jetzt ca. 1 Woche dran rumgetüftelt und habe keine Lösung gefunden (keine die mir wirklich taugt

MfG
Mobius