Winsock c++ pętla nieskńczona

0

Piszę program p2p i mam problem z zapętleniem na serwerze tej części:

	do {
		iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
	if (iResult > 0) {
		//printf("Bytes received: %d\n", iResult);
		printf("Odebrano: ");
		for(int i=0;i<recvbuflen;i++){
			if(recvbuf[i]>0){
				std::cout<<recvbuf[i];
				}}
		printf("\n");


// Send an initial buffer

		 //Echo the buffer back to the sender
		printf("Podaj tekst: ");
cin.clear();
cin.sync();
cin.getline(recvbuf, DEFAULT_BUFLEN);
recvbuflen=strlen(recvbuf);

		iSendResult = send(ClientSocket, recvbuf, recvbuflen, 0);
		if (iSendResult == SOCKET_ERROR) {
			printf("send failed: %d\n", WSAGetLastError());
			closesocket(ClientSocket);
			WSACleanup();
			return 1;
			
		}}

		
	//}else if (iResult == 0)
		//printf("Connection closing...\n");
		//else {
		//printf("recv failed: %d\n", WSAGetLastError());
		//closesocket(ClientSocket);
		//WSACleanup();
		//return 1;
		//}
	} while (iResult > 0);


Natomiast na kliencie:


printf("\n");
printf("Podaj tekst: ");
cin.clear();
cin.sync();
cin.getline(sendbuf, DEFAULT_BUFLEN);
printf("\n");

// Send an initial buffer
iResult = send(ConnectSocket, sendbuf, (int) strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}


// Receive data until the server closes the connection



	
	do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if (iResult > 0)
//printf("Bytes received: %d\n", iResult);
{printf("Odebrano: ");
printf("\n");
		for(int i=0;i<recvbuflen;i++){
			if(recvbuf[i]>0){
				std::cout<<recvbuf[i];
				
			}}}
		//printf("\n");}
//else if (iResult == 0)
//printf("Connection closed\n");
//else
//printf("recv failed: %d\n", WSAGetLastError());
} while (iResult>0);

Próbowałem zrobić pętle nieskończona za pomocoa while(1) ale w konsoli po odebraniu przez klienta tekstu program stoi.
Nie wiem jak to część zapentlić.

1

Proponuje wyrzucic ten smietnik i zastanowic sie jeszcze raz, czy warto podawac takie cos jak chce sie uzyskac pomoc. Rozumiem, ze wypracowania oddawales na zuzytym papierze toaletowym? -.-'

#Podziel ten kod na conajmniej 5 funkcji.
#Nazywaj zmienne sensownie.
#Wyjasnij po co ci ta petla.
#Formatuj kod. Serio, czytanie kodu nie polega na szukaniu, gdzie autor wstawil klamre.
#Uzyj debuggera i podaj wiecej informacji. Stoi nie jest adekwatnym okresleniem do softu.

0

Bo czekasz na przekazanie recvbuflen danych.
Przed wysłaniem tekstu przekaż jego dokładną długość:

int len=strlen(sendbuf);
iResult=send(ConnectSocket,(char*)&len,sizeof(int),0);
iResult=send(ConnectSocket,sendbuf,len,0);

Poza tym poczytaj w dokumentacji co oznacza ten ostatni parametr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1