wuut
01.11.2006, 19:22
hallo leute,
ich schreibe gerade an einem RSH-Client in C/C++ und habe folgendes Problem:
1. ich erstelle ein socket mit:
if ((RSHSocket = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
gameLocal.Printf("Error 1 socket()");
}
2. danach binde ich es
if (bind(RSHSocket, (LPSOCKADDR)&localAddr, sizeof(localAddr)) == 0)
break;
3. ich connecte mit
if (connect(RSHSocket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
if ((error = WSAGetLastError()) != WSAEWOULDBLOCK) {
socketError("connect()", error);
return FALSE;
}
}
4. nun setze ich das socket auf non-block mit:
if (ioctlsocket(RSHSocket, FIONBIO,(u_long *) 1) == SOCKET_ERROR) {
printf("ioctlsocket()2 Error");
}
5. jetzt tausche ich informationenen mit dem RSH-server zwecks anmeldung aus (FreeBSD - UNIX) , rshd server......
6. nun erwartet der server befehle von meinem client, also kriegt er:
rVal = send(RSHSocket, "pwd\x0d", 4, 0);gameLocal.Printf("\nrVal: %d", rVal);
7. wenn der sever jetzt aber die daten in mehrere pakete aufteilt dann muss ich jedes paket auslesen. Da ich mit einem recv() maximal ein paket erwische habe ich das problem dass ich net weiss, wiviele pakete er schickt. in disem Fall höngt mein socket sich auf (obwohl ich es auf non-blocking gesetzt habe).
8. mit der folgenden prozedur habe ich es geschafft, alle daten auszulesen, aber ich muss nach jedem befehl immernoch 2 sekunden warten und das programm sollte auf performance getrimmt sein:
void DC_RSH_Recv ()
{
char * buffer = new char[2048];
char * buffer2 = new char[2048];
char * buffer3;
int b2 = 0;
ZeroMemory(buffer2, sizeof(buffer2));
int count = 0;
bool stillreceive = true;
FD_SET Reader;
FD_ZERO(&Reader);
FD_SET(RSHSocket, &Reader);
while(stillreceive)
{
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
int total;
timeval timeout;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
if (( total = select(0, &Reader, NULL, NULL, &timeout)) == SOCKET_ERROR)
{
DC_RSH_UpdateLog("\nselect()");
//printf("Winsock tutorial error: select function returned with error %d\n", WSAGetLastError());
return;
}
if (FD_ISSET(RSHSocket, &Reader))
{
DC_RSH_UpdateLog("\n-----FD_ISSET");
char buffer[1024];// = 0;
int count = recv(RSHSocket, buffer, sizeof(buffer), 0);
switch(count)
{
case 0:
{
DC_RSH_UpdateLog("\n-----SOCKET_ERROR: connection Closed");
gameLocal.Printf("\n-----SOCKET_ERROR: connection Closed");
/* connection Closed */
break;
}
case SOCKET_ERROR:
{
DC_RSH_UpdateLog("\n-----SOCKET_ERROR: connection aborted/terminated");
gameLocal.Printf("\n-----SOCKET_ERROR: connection aborted/terminated");
/* connection aborted/terminated */
break;
}
default:
{
buffer[strlen(buffer)] = 0;
DC_RSH_UpdateLog("\nrecv(");
DC_RSH_UpdateLog(buffer);
}
}
//DC_REM_Listen();
//DC_REM_Listen();//(RSHSocket , test, 1);
//char test2[2];
//test2[0] = test[0];
//test2[1] = 0;
}
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}
}
also erstens verstehe ich nicht, warum das Socket immer noch blockt, nachdem es auf non-blocking geschaltet wurde (für den fall dass keine daten zum lesen da sind, und ich trotzdem noch ein recv mache.)
ich habe mir alle anderen topics mit dem thema sockets angeschaut und wurde trotzdem nicht schlau draus.
Ich mache definitiv irgendwas falsch.
PLZ hELP:mauer:
wuut
ich schreibe gerade an einem RSH-Client in C/C++ und habe folgendes Problem:
1. ich erstelle ein socket mit:
if ((RSHSocket = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
gameLocal.Printf("Error 1 socket()");
}
2. danach binde ich es
if (bind(RSHSocket, (LPSOCKADDR)&localAddr, sizeof(localAddr)) == 0)
break;
3. ich connecte mit
if (connect(RSHSocket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
if ((error = WSAGetLastError()) != WSAEWOULDBLOCK) {
socketError("connect()", error);
return FALSE;
}
}
4. nun setze ich das socket auf non-block mit:
if (ioctlsocket(RSHSocket, FIONBIO,(u_long *) 1) == SOCKET_ERROR) {
printf("ioctlsocket()2 Error");
}
5. jetzt tausche ich informationenen mit dem RSH-server zwecks anmeldung aus (FreeBSD - UNIX) , rshd server......
6. nun erwartet der server befehle von meinem client, also kriegt er:
rVal = send(RSHSocket, "pwd\x0d", 4, 0);gameLocal.Printf("\nrVal: %d", rVal);
7. wenn der sever jetzt aber die daten in mehrere pakete aufteilt dann muss ich jedes paket auslesen. Da ich mit einem recv() maximal ein paket erwische habe ich das problem dass ich net weiss, wiviele pakete er schickt. in disem Fall höngt mein socket sich auf (obwohl ich es auf non-blocking gesetzt habe).
8. mit der folgenden prozedur habe ich es geschafft, alle daten auszulesen, aber ich muss nach jedem befehl immernoch 2 sekunden warten und das programm sollte auf performance getrimmt sein:
void DC_RSH_Recv ()
{
char * buffer = new char[2048];
char * buffer2 = new char[2048];
char * buffer3;
int b2 = 0;
ZeroMemory(buffer2, sizeof(buffer2));
int count = 0;
bool stillreceive = true;
FD_SET Reader;
FD_ZERO(&Reader);
FD_SET(RSHSocket, &Reader);
while(stillreceive)
{
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
int total;
timeval timeout;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
if (( total = select(0, &Reader, NULL, NULL, &timeout)) == SOCKET_ERROR)
{
DC_RSH_UpdateLog("\nselect()");
//printf("Winsock tutorial error: select function returned with error %d\n", WSAGetLastError());
return;
}
if (FD_ISSET(RSHSocket, &Reader))
{
DC_RSH_UpdateLog("\n-----FD_ISSET");
char buffer[1024];// = 0;
int count = recv(RSHSocket, buffer, sizeof(buffer), 0);
switch(count)
{
case 0:
{
DC_RSH_UpdateLog("\n-----SOCKET_ERROR: connection Closed");
gameLocal.Printf("\n-----SOCKET_ERROR: connection Closed");
/* connection Closed */
break;
}
case SOCKET_ERROR:
{
DC_RSH_UpdateLog("\n-----SOCKET_ERROR: connection aborted/terminated");
gameLocal.Printf("\n-----SOCKET_ERROR: connection aborted/terminated");
/* connection aborted/terminated */
break;
}
default:
{
buffer[strlen(buffer)] = 0;
DC_RSH_UpdateLog("\nrecv(");
DC_RSH_UpdateLog(buffer);
}
}
//DC_REM_Listen();
//DC_REM_Listen();//(RSHSocket , test, 1);
//char test2[2];
//test2[0] = test[0];
//test2[1] = 0;
}
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}
}
also erstens verstehe ich nicht, warum das Socket immer noch blockt, nachdem es auf non-blocking geschaltet wurde (für den fall dass keine daten zum lesen da sind, und ich trotzdem noch ein recv mache.)
ich habe mir alle anderen topics mit dem thema sockets angeschaut und wurde trotzdem nicht schlau draus.
Ich mache definitiv irgendwas falsch.
PLZ hELP:mauer:
wuut