WINSOCK Transmisja nieblokująca

0

Witam, uczę się programować sieciowo i mam pewien problem. O ile transmisję blokującą UDP i TCP umiem i rozumiem tak z połączeniem nieblokującym nie mogę sobie poradzić. Mógłby ktoś poradzić krok po korku jak to zrobić?

Pracuje pod Windowsem, visual studio 2010

0

Napisałem nieblokujący serwer ale nie odbiera mi danych. Moglibyście wskazać gdzie popełniam błąd?

 #include<WinSock.h>
#include<conio.h>
#include<stdio.h>
#pragma comment(lib, "Ws2_32.lib")

int main()
{
	WSADATA wsa;
	int Blad;
	SOCKET G[10];
	Blad=WSAStartup(MAKEWORD(2,2), &wsa);
	if(Blad!=0)
	{
		printf("Blad Inicjalizacji biblioteki");
		_getch();
		return 0;
	}
	SOCKET Gniazdo;
	Gniazdo=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(Gniazdo==-1)
	{
		printf("Blad tworzenia Gniazda");
		_getch();
		return 0;
	}
	sockaddr_in Sin; // Mój
	Sin.sin_addr.s_addr=inet_addr("127.0.0.1");
	Sin.sin_family=AF_INET;
	Sin.sin_port=htons(20000);
	Blad=bind(Gniazdo, (sockaddr*) &Sin, sizeof(Sin));
	if(Blad<0)
	{
		printf("Bind nieudany\n");
		_getch();
		return 0;
	}
	sockaddr_in Klient; //Klienta
	printf("Nasluchiwanie\n");
	Blad=listen(Gniazdo,10);
	if(Blad!=0){
		printf("Blad listen");
		_getch();
		return 0;
	}
	fd_set Fset;
	fd_set Fs;
	FD_ZERO(&Fset);
	FD_SET(Gniazdo, &Fset);
	timeval T;
	u_long val=1;
	ioctlsocket(Gniazdo, FIONBIO, &val); // inicjalizacja trybu nieblokującego
	T.tv_sec=2;
	T.tv_usec=40000;
	int RozmiarKlienta=sizeof(Klient);
	int DeskryptorGniazda;
	char bufor[30]={0};
	for(;;)
	{
		Fs=Fset;
		if(select(0,&Fs, NULL, NULL, &T)<0)
		{
			printf("Blad select\n");
			_getch();
			return 0;
		}
		for(int i=0;i<10;i++)
		{
			if(FD_ISSET(i,&Fs))
			{
				if( i == Gniazdo ) 
				{
					if(DeskryptorGniazda=accept(Gniazdo,(struct sockaddr*)&Klient,&RozmiarKlienta)==-1) 
					{
                        perror( "accept" );
                    } 
					else 
					{
                        FD_SET(DeskryptorGniazda, &Fset); // dodaj do głównego zestawu
						printf( "Nowe polaczenie z %s on socket %d\n", inet_ntoa( Klient.sin_addr ), DeskryptorGniazda);
					}
				}
			}
			else
			{
				Blad=recv(i,bufor,sizeof(bufor),0);
				if(Blad<0)
				{
					printf("Blad odbioru 1\n");
					_getch();
				}
				FD_CLR(i,&Fset);
			}
		}
	}
	closesocket(Gniazdo);
	WSACleanup();
	return 0;
}

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