ErrVal
UDPController::initReciever(int confPort){
	
	sender_length = sizeof(sender_adress);
	UChar mess[20];
		// Initialize Winsock version 2.2

   if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0)

   {

        printf("Server: WSAStartup failed with error %ld\n", WSAGetLastError());

        return -1;

   }

   else

         // printf("Server: The Winsock DLL status is %s.\n", wsaData.szSystemStatus);

 

     // Create a new socket to receive datagrams on.

     RecieveSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

 

     if (RecieveSocket == INVALID_SOCKET)

     {

          printf("Server: Error at socket(): %ld\n", WSAGetLastError());

          // Clean up

          WSACleanup();

          // Exit with error

          return -1;

     }

    
 

     // Set up a SOCKADDR_IN structure that will tell bind that we

     // want to receive datagrams from all interfaces using port 5150.

 

     // The IPv4 family

     reciever_adress.sin_family = AF_INET;

     // Port no. 5150

     reciever_adress.sin_port = htons(confPort);

     // From all interface (0.0.0.0)

     reciever_adress.sin_addr.s_addr = htonl(INADDR_ANY);

 

   // Associate the address information with the socket using bind.

   // At this point you can receive datagrams on your bound socket.

   if (bind(RecieveSocket, (SOCKADDR *)&reciever_adress, sizeof(reciever_adress)) == SOCKET_ERROR)

   {

        printf("Server: bind() failed! Error: %ld.\n", WSAGetLastError());

        // Close the socket

        closesocket(RecieveSocket);

        // Do the clean up

        WSACleanup();

        // and exit with error

        return -1;

     }

     else

          //printf("Server: bind() is OK!\n");

 

   // Some info on the receiver side...

   getsockname(RecieveSocket, (SOCKADDR *)&reciever_adress, (int *)sizeof(reciever_adress));

 

   //printf("Server: Receiving IP(s) used: %s\n", inet_ntoa(reciever_adress.sin_addr));

   //printf("Server: Receiving port used: %d\n", htons(reciever_adress.sin_port));

   //printf("Server: I\'m ready to receive a datagram...\n");


   int SelectTiming = recvfromTimeOutUDP(RecieveSocket, 10, 0); //Set the timeout for 10 secs and 00 usecs
    
	 switch (SelectTiming)

        {

             case 0:

                 // Timed out, do whatever you want to handle this situation

                 printf("Server: Timeout waiting the client...\n");
				 return Err::m_nERR;

                 break;

             case -1:

                 // Error occurred, maybe we should display an error message?

                // Need more tweaking here and the recvfromTimeOutUDP()...

                 printf("Server: Some error encountered with code number: %ld\n", WSAGetLastError());
				 return Err::m_nERR;

                 break;

             default:
				 recieve(mess,20);
				 //printf("Message recieved: %s",mess);
				 //printf("Peer connected\n");
				/// sendto(RecieveSocket, "Yes, Server is Ready..." , 23, 0, (SOCKADDR*) &sender_adress, sender_length);
	 }

    
   
   

  return Err::m_nOK;
}
int main() {

	SOCKET clientSocket,s;
	struct sockaddr_in server_addr,local_addr,peer_addr;
	struct sockaddr_in broadcast_addr;
	char recvbuf[BUFLEN];
	char messagePeer[50];
	char sendbuf[50];
	int iResult;
	WSADATA wsaData;
	int server_addr_len = sizeof(server_addr);
	int broadcast_addr_len = sizeof(broadcast_addr);
	int peer_addr_len = sizeof(peer_addr);
	int listenPort,flag = 0,i,peerListenPort;
	int peerInfo[PEERS];
	int str[INET_ADDRSTRLEN];
	fd_set read;
	int activity;
	int serverTiming,peerTiming;
	int option;
							

	for (i = 0; i < PEERS; i++) {

		peerInfo[i] = 0;
	}

	// Initialize Winsock
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != NO_ERROR) {
		wprintf(L"WSAStartup failed with error: %d\n", iResult);
		return 1;
	}

	printf("Winsock initialized\n");


	//create socket
	clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
	if (clientSocket == INVALID_SOCKET) {
		wprintf(L"connect socket failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	printf("socket created\n");

	memset((char *)&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;//internet address family
	server_addr.sin_port = htons(SERVER_PORT);//server port
	if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0)//server IP address
	{
		printf("\n inet_pton error occured\n");
		return 1;
	}


	/*
	**set up the server properties of client
	*/

	printf("Enter listening port\n");
	scanf_s("%d", &listenPort);

	
	local_addr.sin_family = AF_INET;//internet address family
	local_addr.sin_port = htons(listenPort);//local port
	local_addr.sin_addr.s_addr = INADDR_ANY;//any incoming interface

	//Bind
	if (bind(clientSocket, (struct sockaddr *)&local_addr, sizeof(local_addr)) == SOCKET_ERROR)
	{
		printf("Bind failed with error code : %d", WSAGetLastError());
		closesocket(clientSocket);
		WSACleanup();
		return 1;
	}
	printf("Binding done\n");

	
	snprintf(sendbuf, 50, "%d", listenPort);

	//send listening port to server
	iResult = sendto(clientSocket, sendbuf, (int)strlen(sendbuf), 0, (struct sockaddr *)
		&server_addr, server_addr_len);

	if (iResult == SOCKET_ERROR) {
		wprintf(L"send failed with error: %d\n", WSAGetLastError());
		closesocket(clientSocket);
		WSACleanup();
		return 1;
	}

	printf("Port sent to server\n");
	printf("Waiting for other peers\n");

	broadcast_addr.sin_family = AF_INET;                 //Internet address family 
	broadcast_addr.sin_addr.s_addr = htonl(INADDR_ANY);         // Any incoming interface 
	broadcast_addr.sin_port = htons(BROADCAST_PORT);     // Broadcast port

														  //create socket
	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (s == INVALID_SOCKET) {
		wprintf(L"broadcast failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	//allow multiple listeners on the broadcast address
	int options = 1;
	if ((setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&options, sizeof(options))) < 0) {
		printf("%d", WSAGetLastError());
	}

   //bind to the broadcast port	
	if (bind(s, (struct sockaddr *) &broadcast_addr, sizeof(broadcast_addr)) == SOCKET_ERROR) {

		printf("bind() failed : %d\n", WSAGetLastError());
		exit(EXIT_FAILURE);
	}

	printf("Binding broadcast done\n");
	
	while (TRUE) {

			
		serverTiming = recvfromTimeOutUDP(s, 10, 0);

		switch (serverTiming)

		{

		case 0:

			printf("Server: Timeout !...\n");

			break;

		case -1:

			//error
			printf("Server: Some error encountered with code number: %ld\n", WSAGetLastError());

			break;

		default:

				iResult = recvfrom(s, peerInfo, PEERS*sizeof(int), 0, (struct sockaddr*) &server_addr,
					&server_addr_len);

				if (iResult == SOCKET_ERROR) {

					printf("recvfrom() failed with error code : %d", WSAGetLastError());
					exit(EXIT_FAILURE);
				}

				for (i = 0; i < PEERS; i++) {

					if (peerInfo[i] != 0) {

						if (peerInfo[i] == listenPort) {

							printf("This is me at port %d\n", peerInfo[i]);
						}
						else {

							printf("Peer %d is listening at port %d\n", i + 1, peerInfo[i]);
						}

					}

				}//end for
		
		}///end switch
		
			printf("Send message to peer\n");
			printf("Enter port:\n");
			scanf_s("%d", &peerListenPort);
			printf("Enter message :");
			scanf_s("%s", messagePeer, 50); // not null terminated

			memset((char *)&peer_addr, 0, sizeof(peer_addr));
			peer_addr.sin_family = AF_INET;
			peer_addr.sin_port = htons(peerListenPort);
			if (inet_pton(AF_INET, "127.0.0.1", &peer_addr.sin_addr) <= 0)
			{
				printf("\n inet_pton error occured\n");
				return 1;
			}

			//send the message
			if (sendto(clientSocket, messagePeer, (int)strlen(messagePeer), 0, (struct sockaddr *) &peer_addr,
				peer_addr_len) == SOCKET_ERROR)
			{
				printf("sendto() failed with error code : %d", WSAGetLastError());
				exit(EXIT_FAILURE);
			}

			//clear the buffer
			memset(recvbuf, '\0', BUFLEN);

			peerTiming = recvfromTimeOutUDP(clientSocket, 10, 0);


			switch (peerTiming)

			{

			case 0:

				printf("Peer: Timeout !...\n");

				break;

			case -1:

				//error
				printf("Peer: Some error encountered with code number: %ld\n", WSAGetLastError());

				break;

			default:

				if (recvfrom(clientSocket, recvbuf, BUFLEN, 0, (struct sockaddr *) &peer_addr, &peer_addr_len) == SOCKET_ERROR)
				{
					printf("recvfrom() failed with error code : %d", WSAGetLastError());
					exit(EXIT_FAILURE);
				}

				printf("\nReceived from peer , ip %s,  port %d \n",
					inet_ntop(AF_INET, &(peer_addr.sin_addr), str, INET_ADDRSTRLEN), ntohs(peer_addr.sin_port));

				printf("Data: %s\n", recvbuf);

			}///end switch
				

		
	}//end while

	 // close the socket
	iResult = closesocket(clientSocket);
	if (iResult == SOCKET_ERROR) {
		wprintf(L"close failed with error: %d\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	WSACleanup();




	return 0;
}
Beispiel #3
0
void tcp_InquirePackets(void)
{
	char* TCP_Buffer;
	int cliSocket = -1;
	struct sockaddr_in cli_addr;
	socklen_t clilen;
	
	struct SendClientData* pNum = NULL;
	int addrNum = 0;
	int mUserIdx = 0;
	int mItemIdx = 0;
	
	struct stat st;
	FILE* fpRead;
	int mFileSize = 0;
	int mProgSize = 0;
	int mTcpRet = 0;

	while(recvfromTimeOutUDP(TCP_SockListener, 0, 0) > 0)
	{		
		if((cliSocket = accept(TCP_SockListener, (struct sockaddr *) &cli_addr, &clilen)) != -1)
		{	
			// Allocate mem for buffer
			TCP_Buffer = malloc(TCP_FILE_BUFSIZ);
			
			// Clear buffer
			memset(TCP_Buffer,'\0',TCP_FILE_BUFSIZ);
				
			// Ok the data is ready, call recvfrom() to get it then
			tcp_Read(cliSocket, TCP_Buffer, TCP_FILE_BUFSIZ);			
					    
		    pack_UnpackBroadcast(TCP_Buffer, &TCP_DataFrom);	
		    
		    // Search LList by PacketID
		    if(appIcon_SearchList(&addrNum, TCP_DataFrom.Handlename))
		    {
		    	pNum = (struct SendClientData*)addrNum;
		    	
		    	// Search node by Hostname
		    	if(appIcon_SearchNode(pNum, &mUserIdx, TCP_DataFrom.Hostname))
		    	{   		
		    		// Search file for FileID
		    		if(appIcon_SearchItems(pNum, &mItemIdx, TCP_DataFrom.Extended))
		    		{
		    			stat(pNum->apItemList[mItemIdx],&st);
		    			mFileSize = (int)st.st_size;
		    			mProgSize = 0;
		    			mTcpRet = 0;
		    			fpRead = fopen(pNum->apItemList[mItemIdx], "rb");
		    			
		    			// Clear buffer
						memset(TCP_Buffer,'\0',TCP_FILE_BUFSIZ);
		    			
		    			// Decode command
					    switch(GET_MODE(TCP_DataFrom.IP_Flags))
						{							
							case IPMSG_GETFILEDATA:
								
								while(mFileSize > mProgSize)
								{
									mTcpRet = fread(TCP_Buffer, sizeof(TCP_Buffer[0]), TCP_FILE_BUFSIZ, fpRead);									
									mTcpRet = tcp_Write(cliSocket, TCP_Buffer, mTcpRet);																	
									mProgSize += mTcpRet;
								}
								
								// Close file
								fclose(fpRead);
								break;
								
							case IPMSG_GETDIRFILES:
								
								break;					
							
								
							default:
								printf("unknown TCP command: %s\n", TCP_Buffer);
						}		    			
		    					    			
		    			if(pNum->dItemsLeft[mUserIdx] > 0)
		    				pNum->dItemsLeft[mUserIdx] -= 1;		    			
		    			sendDialog_Destroy(NULL, (XtPointer) pNum, NULL);
		    		}		    		
		    	}
		    }		
			
			// Release buffer memory
			free(TCP_Buffer);
			
			// Close socket
			tcp_Close(cliSocket);
		}		
	}		
}