socket spinnt (verhält sich unterschiedlich zwischen 2 rechnern)
-
folgender code soll eine datei verschicken:
void sendfile (HANDLE hfile) { char buff[1400]; DWORD bytes_read; SOCKADDR_IN sin; SOCKET sock; LINGER linger; sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) shit ("socket"); linger.l_linger = 60; linger.l_onoff = 1; if (SOCKET_ERROR == setsockopt (sock, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(LINGER))) shit ("setsockopt(LINGER)"); sin.sin_family = AF_INET; sin.sin_port = htons (atoi(g_port)); sin.sin_addr.s_addr = inet_addr (g_ipaddress); if (connect (sock, (SOCKADDR*)&sin, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) shit ("connect"); DWORD tid; CloseHandle (CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)receiver_thread, (void*)sock, 0, &tid)); /* char reset[] = {0x12, 0x3f}; send (sock, reset, 2, 0); */ while (1) { BOOL res = ReadFile (hfile, buff, 1400, &bytes_read, NULL); if (res == 0 || bytes_read == 0) break; if (SOCKET_ERROR == send (sock, buff, bytes_read, 0)) shit ("send"); Sleep (atoi(g_packetdelay)); print ("Sending %d bytes\n", bytes_read); } Sleep (atoi(g_closingdelay)); print ("closing socket\n"); closesocket (sock); print ("closed\n"); }auf der einen kiste macht er's anstandslos. auf einer anderen braucht er die delays (siehe die Sleep()s im code). es scheint so, als würde auf dem anderen rechner die 'send' und 'closesocket'-aufrufe asynchron sein. warum nur?
-
send sendet nicht immer alle bytes welche es übergeben bekommt. Die tatsächliche gesendeten anzahl bekommst du aber von der funktion zurückgegeben. Das heißt wenn du 10 bytes senden willst kann es sein das send beim ersten aufruf nur 6 bytes sendet und du die restlichen 4 bytes durch einen erneuten aufruf von send verschickt werden müssen.
-> Also: send (und recv) in einer schleife aufrufen bis die summe der rückgabewerte gleich der größe der zu versendenen daten sind.Kleines Beispiel: (ungetestet)
char *buffer = hier_is_irgendwas_drin; int dataToSend = 10; int dataSend = 0; while (dataToSend > 0) { int ret = send(sock,buffer+dataSend,dataToSend,0); if (ret < 0) return false; dataSend += ret; dataToSend -= ret; }
-
newvet schrieb:
send sendet nicht immer alle bytes welche es übergeben bekommt.
wow, danke

_das_ muss es sein, werd ich morgen gleich nachbessern.
btw: ich wusste doch, dass da was faul ist. manchmal bin ich einfach zu blöd für die einfachsten sachen