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; }
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); } } }