#include #include #include #include // Receiver // //int wmain(int argc, wchar_t** argv) //{ // WSADATA wsa = {0}; // WSAStartup(MAKEWORD(2, 2), &wsa); // sockaddr_in addr = {0}; // addr.sin_addr.s_addr = inet_addr("192.168.2.200"); // //addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // addr.sin_family = AF_INET; // addr.sin_port = htons(54321); // SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // if(s != INVALID_SOCKET && (bind(s, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR)) // { // // make sure of nonblocked-ness // u_long olOff = 0; // ioctlsocket(s, FIONBIO, &olOff); // int maxSize = 0, optSize = sizeof(int), maxRecvBuf = 0; // getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char*)&maxSize, &optSize); // printf("Max message size = %i\n", maxSize); // getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&maxRecvBuf, &optSize); // //setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&maxSize, sizeof(maxSize)); // printf("Max recv buffer size = %i\n", maxRecvBuf); // ULONG reps = wcstoul(argv[1], NULL, 10); // char* buf = new char[maxSize]; // memset(buf, 0, maxSize); // for(ULONG i = 0; i < reps; ++i) // { // sockaddr_in sender; // int senderSize = sizeof(sender); // int recvSoFar = 0; // int toRec = maxSize; // while(recvSoFar != toRec) // { // int recThisTime = recvfrom(s, &buf[recvSoFar], toRec - recvSoFar, 0, (sockaddr*)&sender, &senderSize); // if(recThisTime == SOCKET_ERROR) // { // printf("Rep %lu failed to rec with error %lu\n", i, WSAGetLastError()); // break; // } // else // { // recvSoFar += recThisTime; // if(recvSoFar >= 4) // { // toRec = (*(int*)buf); // } // printf("Rep %lu recv'd %i bytes from %s:%hu (%i/%i)\n", i, recThisTime, inet_ntoa(sender.sin_addr), ntohs(sender.sin_port), recvSoFar, toRec); // } // } // } // delete [] buf; // closesocket(s); // } // else // { // printf("Couldn't create or bind socket, error %lu\n", WSAGetLastError()); // closesocket(s); // } // WSACleanup(); // return 0; } // sender #pragma comment(lib, "ws2_32.lib") #include int __cdecl wmain(int argc, wchar_t** argv) { { WSADATA wsa = {0}; srand(GetTickCount()); WSAStartup(MAKEWORD(2, 2), &wsa); SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(s != INVALID_SOCKET) { // make sure of nonblocked-ness u_long olOff = 0; ioctlsocket(s, FIONBIO, &olOff); int maxSize = 0, optSize = sizeof(int); getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char*)&maxSize, &optSize); printf("Max message size = %i\n", maxSize); ULONG reps = wcstoul(argv[1], NULL, 10); for(ULONG i = 0; i < reps; ++i) { sockaddr_in* pAddr = new sockaddr_in(); pAddr->sin_addr.s_addr = inet_addr("192.168.2.200"); //pAddr->sin_addr.s_addr = inet_addr("127.0.0.1"); pAddr->sin_family = AF_INET; pAddr->sin_port = htons(54321); int sentSoFar = 0; // allow us to prepend the size int dataSize = maxSize - 4; //rand() % (maxSize - 4); std::string str(dataSize, 'l'); int toSend = dataSize + 4; str.insert(0, (char*)&toSend, 4); setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&toSend, sizeof(toSend)); while(sentSoFar != toSend) { //Sleep(100); int sentThisTime = sendto(s, &str[sentSoFar], toSend - sentSoFar, 0, (sockaddr*)pAddr, sizeof(*pAddr)); if(sentThisTime == SOCKET_ERROR) { printf("Rep %lu failed with error %lu\n", i, WSAGetLastError()); break; } else { sentSoFar += sentThisTime; printf("Rep %lu sent %i bytes (%i/%i)\n", i, sentThisTime, sentSoFar, toSend); } } // ensure the address buffer is hosed memset(pAddr, 9, sizeof(*pAddr)); delete pAddr; } closesocket(s); } else { printf("Couldn't create socket, error %lu\n", WSAGetLastError()); } WSACleanup(); return 0; } }