Daten ueber socket - sehe den Fehler nicht

04/12/2008 - 08:34 von Curtis Newton | Report spam
Hallo,

ich programmiere gerade eine Client-Server-Anwendung. Dabei will ich
Daten übertragen. Die sockets werden geöffnet mit
socketId=socket(AF_INET,SOCK_STREAM,0)

Der Versand:
const int MAX_RECV_LEN = 1024;
void TcpSocket::send_uchars(unsigned char *val, unsigned int len)
{
unsigned char *pSrc=val;
int bytes_send=0, total_bytes=0;

int send_len=min(MAX_RECV_LEN, len);
while(send_len)
{
if ((bytes_send=send(socketId, (char *) pSrc, send_len, 0)) == -1)
{
printf("Ups");
return;
}
pSrc +=bytes_send;
total_bytes+=bytes_send;

send_len=min(MAX_RECV_LEN, len-total_bytes);
}
recv_ack();
send_ack();
}

Der Empfang:
int TcpSocket::recieve_uchars(unsigned char *dst, unsigned int number)
{
int numbytes = 0;
int i, j, end = 0, total_bytes = 0;

char *result;
char buffer[MAX_RECV_LEN]; // reuse the same memory for buffer

result = (char *) dst;
j = 0;

int rec_len=min(MAX_RECV_LEN, number);
// receiving the incoming bits
while (!end)
{
if ((numbytes=recv(socketId, buffer, rec_len, 0))==-1)
perror("recv");
for (i=0; i<numbytes; i++)
{
result[j] = buffer[i];
j++;
}
total_bytes = total_bytes + numbytes;
if (total_bytes == number) end = 1;

rec_len=min(MAX_RECV_LEN, (number-total_bytes));
}

send_ack();
recv_ack();

return total_bytes;
}

Das geht eine Weile gut (10-20, manchma auch nur 3 mal), dann bleibt der
Empfang stehen und auf der Senderseite wird mir gesagt, der Server hat
die Verbindung hart zurückgesetzt. Was kann das sein. Sieht jemand einen
Fehler im obigen Code?

Bye
 

Lesen sie die antworten

#1 Curtis Newton
08/12/2008 - 16:25 | Warnen spam
Am Thu, 4 Dec 2008 08:34:53 +0100 schrieb Curtis Newton:

Verbindung hart zurückgesetzt



Ich kann den Fehler einfach nicht finden. Ich sende und empfange jeweils
größere Datenpakete. Nach einer Weile schlàgt immer das Empfangen auf
der Serverseite fehl. Keine Ahnung wieso. Ich prüfe schon immer mit
select, ob ich senden respektive empfangen kann. Ich hànge mal unter die
beiden Routinen an, vielleicht sieht ja jemand was:

const int MAX_RECV_LEN = 1024;
int send(unsigned char *src, int data_size, int socketId)
{
int bytes_send=0, total_bytes=0;
unsigned char *pSrc=src;

fd_set rfds;
FD_ZERO(&rfds);
FD_SET(socketId, &rfds);

int send_len=min(MAX_RECV_LEN, data_size);
while(send_len)
{
if(select(socketId+1, NULL, &rfds, NULL, NULL)==-1)
{
printf("Error select");
}
if ((bytes_send=send(socketId, (char *) pSrc, send_len, 0)) == -1)
{
return -1;
}
pSrc +=bytes_send;
total_bytes+=bytes_send;

send_len=min(MAX_RECV_LEN, data_size-total_bytes);
}
return total_bytes;
}


int recieve(unsigned char *dst, int data_size, int socket)
{
int numbytes = 0;
int j, end = 0, total_bytes = 0;

char buffer[MAX_RECV_LEN+1]; // reuse the same memory for buffer

char *result = (char *) dst;

j = 0;

fd_set rfds;
FD_ZERO(&rfds);
FD_SET(socket, &rfds);

int rec_len=min(MAX_RECV_LEN, data_size);
// receiving the incoming bits
while (!end)
{
int s;
if((s=select(socket+1, &rfds, NULL, NULL, NULL))==-1)
{
printf("Error select");
}
if(!s) printf("==");

if ((numbytes=recv(socket, buffer, rec_len, 0))==-1)
{
printf("Error recieving uchar (bytes send=%i)", total_bytes);
return -1;
}
for(int i=0; i<numbytes; i++)
{
result[j] = buffer[i];
j++;
}

total_bytes = total_bytes + numbytes;
if (total_bytes == data_size)
end = 1;

rec_len=min(MAX_RECV_LEN, (data_size-total_bytes));
}

return total_bytes;
}


Bye

Ähnliche fragen