void initConnection(char *empfIP,char *port, char* file, int fenstergroesse){ struct request nachricht; char* reqChar; int retSend, reqLen,test; unsigned long addr; struct hostent *host_info; WSADATA wsaData; WORD wVersionRequested; FILE *fp; //komplett von http://msdn.microsoft.com/de-de/library/windows/desktop/ms738630(v=vs.85).aspx übernommen int RetVal,testi,AddrLen; ADDRINFO Hints, *AddrInfo; char AddrName[NI_MAXHOST]; struct sockaddr_storage Addr; //komplett von http://msdn.microsoft.com/de-de/library/windows/desktop/ms738630(v=vs.85).aspx übernommen wVersionRequested = MAKEWORD(2,1); if( WSAStartup( wVersionRequested,&wsaData ) == SOCKET_ERROR ){ printf( "Error: WSAStartup() throws error nr. %d!\n" ,WSAGetLastError()); exit(-1); } //komplett von http://msdn.microsoft.com/de-de/library/windows/desktop/ms738630(v=vs.85).aspx übernommen memset(&Hints, 0, sizeof (Hints)); Hints.ai_family = AF_INET6; Hints.ai_socktype = SOCK_DGRAM; RetVal = getaddrinfo(empfIP, port, &Hints, &AddrInfo); if (RetVal != 0) { fprintf(stderr, "Cannot resolve address [%s] and port [%s], error %d: %s\n", empfIP, port, RetVal, gai_strerror(RetVal)); WSACleanup(); exit(-1); } // // Try each address getaddrinfo returned, until we find one to which // we can successfully connect. // for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) { // Open a socket with the correct address family for this address. ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); printf("socket call with family: %d socktype: %d, protocol: %d\n", AI->ai_family, AI->ai_socktype, AI->ai_protocol); if (ConnSocket == INVALID_SOCKET) printf("socket call failed with %d\n", WSAGetLastError()); if (ConnSocket == INVALID_SOCKET) { fprintf(stderr, "Error Opening socket, error %d\n", WSAGetLastError()); continue; } printf("Attempting to connect to: %s\n", empfIP ? empfIP : "localhost"); if (connect(ConnSocket, AI->ai_addr, (int) AI->ai_addrlen) != SOCKET_ERROR) break; testi = WSAGetLastError(); if (getnameinfo(AI->ai_addr, (int) AI->ai_addrlen, AddrName, sizeof (AddrName), NULL, 0, NI_NUMERICHOST) != 0) strcpy_s(AddrName, sizeof (AddrName), UNKNOWN_NAME); fprintf(stderr, "connect() to %s failed with error %d\n", AddrName, testi); closesocket(ConnSocket); } if (AI == NULL) { fprintf(stderr, "Fatal error: unable to connect to the server.\n"); WSACleanup(); exit(-1); } AddrLen = sizeof (Addr); if (getpeername(ConnSocket, (LPSOCKADDR) & Addr, (int *) &AddrLen) == SOCKET_ERROR) { fprintf(stderr, "getpeername() failed with error %d\n", WSAGetLastError()); } else { if (getnameinfo((LPSOCKADDR) & Addr, AddrLen, AddrName, sizeof (AddrName), NULL, 0, NI_NUMERICHOST) != 0) strcpy_s(AddrName, sizeof (AddrName), UNKNOWN_NAME); printf("Connected to %s, port %d, protocol %s, protocol family %s\n", AddrName, ntohs(SS_PORT(&Addr)), (AI->ai_socktype == SOCK_STREAM) ? "TCP" : "UDP", (AI->ai_family == PF_INET) ? "PF_INET" : "PF_INET6"); } //komplett von http://msdn.microsoft.com/de-de/library/windows/desktop/ms738630(v=vs.85).aspx übernommen //schicke erste nachricht nachricht.FlNr = (long) fenstergroesse; //fenstergröße if(file != NULL) memcpy(nachricht.fname,file,sizeof(nachricht.fname));//dateiname nachricht.fname[strlen(file)] = '\0'; nachricht.ReqType = ReqHello;//nachrichtentyp nachricht.name[0] = '\0'; fp = openFile(file); nachricht.SeNr = getFileSize();//größe der datei closeFile(fp); //umwandeln des struct request in char* reqChar = (char*) malloc(sizeof(nachricht)); memcpy(reqChar,&nachricht,sizeof(nachricht)); sizeof(nachricht); UserInformation(2,&nachricht,NULL); //senden der ersten nachricht retSend = sendto(ConnSocket,reqChar,sizeof(nachricht),0,AI->ai_addr, (int) AI->ai_addrlen); //auswerten des returnwertes von send if(retSend != sizeof(nachricht)){ printf("Error: Es wurden nicht alle Daten versand!"); } }
int __cdecl main() { WSADATA wsd; INT nStartup = 0, nErr = 0, ret = 0; SOCKET lsock = INVALID_SOCKET, asock = INVALID_SOCKET; SOCKADDR_STORAGE addr = {0}; WSAPOLLFD fdarray = {0}; ULONG uNonBlockingMode = 1; CHAR buf[MAX_PATH] = {0}; HANDLE hThread = NULL; DWORD dwThreadId = 0; nErr = WSAStartup(WS_VER,&wsd); if (nErr) { WSASetLastError(nErr); ERR("WSAStartup"); exit(0); } else { nStartup++; } if (NULL == (hCloseSignal = CreateEvent(NULL, TRUE, FALSE, NULL))) { ERR("CreateEvent"); exit(0); } /* if (NULL == (hThread = CreateThread(NULL, 0, ConnectThread, NULL, 0, &dwThreadId))) { ERR("CreateThread"); //exit__leave; } */ addr.ss_family = AF_INET; INETADDR_SETANY((SOCKADDR*)&addr); SS_PORT((SOCKADDR*)&addr) = htons(DEFAULT_PORT); if (INVALID_SOCKET == (lsock = socket(AF_INET, SOCK_STREAM, 0))) { ERR("socket"); exit(0); } /* if (SOCKET_ERROR == ioctlsocket(lsock, FIONBIO, &uNonBlockingMode)) { ERR("FIONBIO"); exit(0); } */ if (SOCKET_ERROR == bind(lsock, (SOCKADDR*)&addr, sizeof (addr))) { ERR("bind"); exit(0); } if (SOCKET_ERROR == listen(lsock, 100)) { ERR("listen"); exit(0); } //Call WSAPoll for readability of listener (accepted) //fdarray.fd = lsock; //fdarray.events = POLLRDNORM | POLLWRNORM; /* if (SOCKET_ERROR == (ret = WSAPoll(&fdarray, 1, DEFAULT_WAIT))) { ERR("WSAPoll"); exit(0); } */ while (1) { //if (ret) { //if ((fdarray.revents & POLLRDNORM) || (fdarray.revents & POLLWRNORM)) { // printf("Main: Connection established.\n"); if (INVALID_SOCKET == (asock = accept(lsock, NULL, NULL))) { ERR("accept"); //__leave; } /* if (SOCKET_ERROR == (ret = recv(asock, buf, sizeof(buf), 0))) { ERR("recv"); } else { printf("Main: recvd %d bytes\n",ret); } */ //} //} //Call WSAPoll for writeability of accepted fdarray.fd = asock; fdarray.events = POLLWRNORM; if (SOCKET_ERROR == (ret = WSAPoll(&fdarray, 1, DEFAULT_WAIT))) { ERR("WSAPoll"); // exit } if (ret) { if (fdarray.revents & POLLWRNORM) { if (SOCKET_ERROR == (ret = send(asock, TST_MSG, sizeof(TST_MSG), 0))) { ERR("send"); // exit } else { printf("Main: sent %d bytes\n",ret); closesocket(asock); } } } } //SetEvent(hCloseSignal); //WaitForSingleObject(hThread,DEFAULT_WAIT); /* clean up before exit */ CloseHandle(hCloseSignal); CloseHandle(hThread); CLOSESOCK(asock); CLOSESOCK(lsock); if (nStartup) { WSACleanup(); } return 0; }