Skip to content

Instantly share code, notes, and snippets.

@amurzeau
Created February 3, 2016 00:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amurzeau/a0a1b78483b035144d8a to your computer and use it in GitHub Desktop.
Save amurzeau/a0a1b78483b035144d8a to your computer and use it in GitHub Desktop.
synchronous client & server to test fastpath feature
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <stdio.h>
#ifndef SIO_LOOPBACK_FAST_PATH
# define SIO_LOOPBACK_FAST_PATH 0x98000010
#endif
#define assertp(_Expression) \
if(!(_Expression)) { \
printf("assertp failed at %s:%d: %s\n", __FILE__, __LINE__, #_Expression); \
abort(); \
}
int main(int argc, char **argv) {
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
const int PING_LOOPS = 10000;
SOCKET inputSocket;
char buffer[1024*64];
int flag;
int r;
// Setup client
inputSocket = socket(AF_INET, SOCK_STREAM, 0);
assertp(inputSocket != INVALID_SOCKET);
flag = 1;
if(argc > 1 && atoi(argv[1]) == 0)
flag = 0;
printf("fastpath flag: %d\n", flag);
assertp(WSAIoctl(inputSocket,
SIO_LOOPBACK_FAST_PATH,
&flag,
sizeof(flag),
NULL,
0,
&r,
NULL,
NULL) == 0);
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);
sin.sin_port = htons(9123);
sin.sin_family = AF_INET;
assertp(connect(inputSocket, (struct sockaddr *) &sin, sizeof(sin)) == 0);
LARGE_INTEGER begin, end;
LARGE_INTEGER perf_frequency;
QueryPerformanceFrequency(&perf_frequency);
QueryPerformanceCounter(&begin);
for(int i = 0; i < PING_LOOPS; i++) {
send(inputSocket, buffer, sizeof(buffer), 0);
}
QueryPerformanceCounter(&end);
double benchTime = (double)(end.QuadPart - begin.QuadPart) / perf_frequency.QuadPart;
printf("Done: %f s, %.3lf gbits/s\n", benchTime, PING_LOOPS * sizeof(buffer) / benchTime / (1024*1024*1024) * 8);
shutdown(inputSocket, SD_BOTH);
closesocket(inputSocket);
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <stdio.h>
#ifndef SIO_LOOPBACK_FAST_PATH
# define SIO_LOOPBACK_FAST_PATH 0x98000010
#endif
#define assertp(_Expression) \
if(!(_Expression)) { \
printf("assert failed at %s:%d: %s\n", __FILE__, __LINE__, #_Expression); \
abort(); \
}
static void checkLastError_(const char* file, int line) {
int lastError = WSAGetLastError();
if(lastError && lastError != 10054) {
printf("failed %s:%d: %d\n", file, line, lastError);
abort();
}
}
#define checklasterror() checkLastError_(__FILE__, __LINE__)
int main(int argc, char **argv) {
WSADATA wsa;
SetLastError(0);
assertp(WSAStartup(MAKEWORD(2, 2), &wsa) == 0);
checklasterror();
SOCKET outputServerSocket, outputSocket;
char buffer[1024*64];
int flag;
int r;
// Setup socket server
outputServerSocket = socket(AF_INET, SOCK_STREAM, 0);
assertp(outputServerSocket != INVALID_SOCKET);
checklasterror();
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);
sin.sin_port = htons(9123);
sin.sin_family = AF_INET;
assertp(bind(outputServerSocket, (struct sockaddr *) &sin, sizeof(sin)) == 0);
checklasterror();
flag = 1;
if(argc > 1 && atoi(argv[1]) == 0)
flag = 0;
printf("fastpath flag: %d\n", flag);
assertp(WSAIoctl(outputServerSocket,
SIO_LOOPBACK_FAST_PATH,
&flag,
sizeof(flag),
NULL,
0,
&r,
NULL,
NULL) == 0);
checklasterror();
assertp(listen(outputServerSocket, 1) == 0);
checklasterror();
WSABUF buf;
buf.buf = buffer;
buf.len = sizeof(buffer);
while(1) {
struct sockaddr_in6 csin;
socklen_t csinSize = sizeof(csin);
outputSocket = accept(outputServerSocket, (struct sockaddr *) &csin, &csinSize);
assertp(outputSocket != INVALID_SOCKET);
checklasterror();
for(;;) {
r = recv(outputSocket, buffer, sizeof(buffer), 0);
checklasterror();
if(r <= 0)
break;
}
printf("Done with last error: %d\n", WSAGetLastError());
closesocket(outputSocket);
}
closesocket(outputServerSocket);
WSACleanup();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment