18,356
社区成员
发帖
与我相关
我的任务
分享
////////////////////////////////////////////////////////////////
// app entry
////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsaData;
int err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
fprintf(stderr, "Initialize WinSock failed! error %d\n", err);
return 0;
}
++argv;
--argc;
if ( argc > 0 ) {
if ( stricmp(argv[0], "--help") == 0 || stricmp(argv[0], "-h") == 0 ) {
} else if ( stricmp(argv[0], "tcp") == 0 ) {
return tcp(argc, argv);
} else if ( stricmp(argv[0], "udp") == 0 ) {
return udp(argc, argv);
} else {
fprintf(stderr, "invalid parameter \"%s\"!\n", argv[0]);
}
}
fprintf(stderr, "testnet\nusage: testnet tcp|udp [options]\n");
return 0;
}
接收端如下调用:
testnet udp recv 1234 131072绑定到1234端口接收,接收buffer大小为128KB
发送端如下调用:
testnet udp send 192.168.1.66 1234 1024
发送到192.168.1.66的1234端口,发送包大小为1024字节,请将IP地址改为你的接收机的IP地址
////////////////////////////////////////////////////////////////
// UDP
////////////////////////////////////////////////////////////////
// testnet udp recv [<bind port> [<buffer size>]]\n
int udp_recv(int argc, char* argv[])
{
printf("udp_recv(server):\n");
int port = 3000;
if ( argc > 1 ) {
if ( sscanf(argv[1], "%d", &port) != 1 ) {
fprintf(stderr, "invalid udp port \"%s\"\n", argv[1]);
return -1;
}
}
int buf_size = 1024 * 1;
if ( argc > 2 ) {
if ( sscanf(argv[2], "%d", &buf_size) != 1 ) {
fprintf(stderr, "invalid buffer size \"%s\"\n", argv[2]);
return -2;
}
}
LPBYTE buf = new BYTE[buf_size];
if ( NULL == buf ) {
perror("allocate buffer");
return -3;
}
printf("buffer size %d\n", buf_size);
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if ( INVALID_SOCKET == s ) {
perror("creat UDP socket");
return -4;
}
int recv_buf_size = buf_size * 2 + 1024 * 32;
int err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&recv_buf_size, sizeof(recv_buf_size));
if ( err < 0 ) {
perror("set socket recv buffer size");
return -6;
}
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr = INADDR_ANY;
sa.sin_port = htons(port);
err = bind(s, (struct sockaddr*)&sa, sizeof(sa));
if ( err < 0 ) {
perror("bind");
return -5;
}
printf("bind to port %d\n", port);
// recv loop
int stat_bytes = 0;
DWORD stat_last_time = timeGetTime();
while ( !_kbhit() ) {
#ifdef USE_SELECT
FD_SET fdr;
FD_ZERO(&fdr);
FD_SET(s, &fdr);
struct timeval tv = {0, 50000}; // 50ms
err = select(0, &fdr, NULL, NULL, &tv);
if ( err < 0 )
break;
if ( err > 0 && FD_ISSET(s, &fdr) )
#endif/*USE_SELECT*/
{
int sa_len = sizeof(sa);
err = recvfrom(s, (char*)buf, buf_size, 0, (struct sockaddr*)&sa, &sa_len);
if ( err < 0 ) {
perror("recv");
return -7;
}
stat_bytes += err;
}
// Stat.
DWORD time_now = timeGetTime();
DWORD time_escape = time_now - stat_last_time;
if ( time_escape >= 1000 ) {
double speed_mb = (stat_bytes * 1000.0) / (time_escape * 1024.0 * 1024.0);
printf("recv %.1fKB in %.1fs, speed is %.1fMB/s\n", stat_bytes / 1024.0, time_escape / 1000.0, speed_mb);
stat_last_time = time_now;
stat_bytes = 0;
}
}
delete []buf;
return 0;
}
// testnet udp send [<remote ip> <remote port> [<buffer size>]]
int udp_send(int argc, char* argv[])
{
printf("udp_send(client):\n");
unsigned long ip = inet_addr("127.0.0.1");
if (argc > 1 ) {
ip = inet_addr(argv[1]);
if ( 0 == ip ) {
fprintf(stderr, "invalid IP address \"%s\"\n", argv[1]);
return -1;
}
}
int port = 3000;
if ( argc > 2 ) {
if ( sscanf(argv[2], "%d", &port) != 1 ) {
fprintf(stderr, "invalid udp port \"%s\"\n", argv[2]);
return -2;
}
}
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr = ip;
sa.sin_port = htons(port);
int buf_size = 1024 * 1;
if ( argc > 3 ) {
if ( sscanf(argv[3], "%d", &buf_size) != 1 ) {
fprintf(stderr, "invalid buffer size \"%s\"\n", argv[3]);
return -3;
}
}
LPBYTE buf = new BYTE[buf_size];
if ( NULL == buf ) {
perror("allocate buffer");
return -4;
}
for ( int i = 0; i < buf_size; i++ )
buf[i] = (BYTE)i;
printf("packet size %d\n", buf_size);
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if ( INVALID_SOCKET == s ) {
perror("creat UDP socket");
return -5;
}
int send_buf_size = buf_size * 2 + 1024 * 32;
int err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&send_buf_size, sizeof(send_buf_size));
if ( err < 0 ) {
perror("set socket send buffer size");
return -6;
}
// send loop
int stat_bytes = 0;
DWORD stat_last_time = timeGetTime();
while ( !_kbhit() ) {
#ifdef USE_SELECT
FD_SET fdw;
FD_ZERO(&fdw);
FD_SET(s, &fdw);
struct timeval tv = {0, 50000}; // 50ms
err = select(0, NULL, &fdw, NULL, &tv);
if ( err < 0 )
break;
if ( err > 0 && FD_ISSET(s, &fdw) )
#endif/*USE_SELECT*/
{
err = sendto(s, (char*)buf, buf_size, 0, (struct sockaddr*)&sa, sizeof(sa));
if ( err < 0 ) {
perror("send");
return -7;
}
stat_bytes += err;
}
// Stat.
DWORD time_now = timeGetTime();
DWORD time_escape = time_now - stat_last_time;
if ( time_escape >= 1000 ) {
double speed_mb = (stat_bytes * 1000.0) / (time_escape * 1024.0 * 1024.0);
printf("send %.1fKB in %.1fs, speed is %.1fMB/s\n", stat_bytes / 1024.0, time_escape / 1000.0, speed_mb);
stat_last_time = time_now;
stat_bytes = 0;
}
}
delete []buf;
return 0;
}
int udp(int argc, char* argv[])
{
printf("udp:\n");
++argv;
--argc;
if ( argc > 0 ) {
if ( stricmp(argv[0], "--help") == 0 || stricmp(argv[0], "-h") == 0 ) {
} else if ( stricmp(argv[0], "recv") == 0 ) {
return udp_recv(argc, argv);
} else if ( stricmp(argv[0], "send") == 0 ) {
return udp_send(argc, argv);
} else {
fprintf(stderr, "invalid parameter \"%s\"!\n", argv[0]);
}
}
fprintf(stderr, "testnet udp recv [<bind port> [<buffer size>]]\n");
fprintf(stderr, "testnet udp send [<remote ip> <remote port> [<buffer size>]]\n");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <conio.h> // for _kbhit()
#include <Winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#include <Mmsystem.h> // for timeGetTime()
#pragma comment (lib, "Winmm.lib")
#define USE_SELECT
////////////////////////////////////////////////////////////////
// TCP
////////////////////////////////////////////////////////////////
// testnet tcp recv [<bind port> [<buffer size>]]\n
int tcp_recv(int argc, char* argv[])
{
printf("tcp_recv(server):\n");
int port = 3000;
if ( argc > 1 ) {
if ( sscanf(argv[1], "%d", &port) != 1 ) {
fprintf(stderr, "invalid tcp port \"%s\"\n", argv[1]);
return -1;
}
}
int buf_size = 1024 * 32;
if ( argc > 2 ) {
if ( sscanf(argv[2], "%d", &buf_size) != 1 ) {
fprintf(stderr, "invalid buffer size \"%s\"\n", argv[2]);
return -2;
}
}
LPBYTE buf = new BYTE[buf_size];
if ( NULL == buf ) {
perror("allocate buffer");
return -3;
}
printf("buffer size %d\n", buf_size);
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( INVALID_SOCKET == s ) {
perror("creat TCP socket");
return -4;
}
int recv_buf_size = buf_size * 2 + 1024 * 32;
int err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&recv_buf_size, sizeof(recv_buf_size));
if ( err < 0 ) {
perror("set socket recv buffer size");
return -6;
}
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr = INADDR_ANY;
sa.sin_port = htons(port);
err = bind(s, (struct sockaddr*)&sa, sizeof(sa));
if ( err < 0 ) {
perror("bind");
return -5;
}
printf("bind to port %d\n", port);
err = listen(s, 1);
if ( err < 0 ) {
perror("listen");
return -6;
}
// accept loop
printf("wait for client connect ...\n");
int sa_len = sizeof(sa);
SOCKET sclient = INVALID_SOCKET;
while ( !_kbhit() ) {
FD_SET fdr;
FD_ZERO(&fdr);
FD_SET(s, &fdr);
struct timeval tv = {0, 50000}; // 50ms
err = select(0, &fdr, NULL, NULL, &tv);
if ( err < 0 )
break;
if ( err > 0 && FD_ISSET(s, &fdr) ) {
sclient = accept(s, (struct sockaddr*)&sa, &sa_len);
break;
}
}
if ( INVALID_SOCKET == sclient ) {
printf("cancel\n");
return 0;
}
printf("client %s:%d connected.\n", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
if ( _kbhit() ) _getch(); // clear key store
// recv loop
int stat_bytes = 0;
DWORD stat_last_time = timeGetTime();
while ( !_kbhit() ) {
#ifdef USE_SELECT
FD_SET fdr;
FD_ZERO(&fdr);
FD_SET(sclient, &fdr);
struct timeval tv = {0, 50000}; // 50ms
err = select(0, &fdr, NULL, NULL, &tv);
if ( err < 0 )
break;
if ( err > 0 && FD_ISSET(sclient, &fdr) )
#endif/*USE_SELECT*/
{
err = recv(sclient, (char*)buf, buf_size, 0);
if ( err < 0 ) {
perror("recv");
return -7;
} else if ( 0 == err ) {
printf("client close connection.\n");
return 0;
}
stat_bytes += err;
}
// Stat.
DWORD time_now = timeGetTime();
DWORD time_escape = time_now - stat_last_time;
if ( time_escape >= 1000 ) {
double speed_mb = (stat_bytes * 1000.0) / (time_escape * 1024.0 * 1024.0);
printf("recv %.1fKB in %.1fs, speed is %.1fMB/s\n", stat_bytes / 1024.0, time_escape / 1000.0, speed_mb);
stat_last_time = time_now;
stat_bytes = 0;
}
}
delete []buf;
return 0;
}
// testnet tcp send [<remote ip> <remote port> [<buffer size>]]
int tcp_send(int argc, char* argv[])
{
printf("tcp_send(client):\n");
unsigned long ip = inet_addr("127.0.0.1");
if (argc > 1 ) {
ip = inet_addr(argv[1]);
if ( 0 == ip ) {
fprintf(stderr, "invalid IP address \"%s\"\n", argv[1]);
return -1;
}
}
int port = 3000;
if ( argc > 2 ) {
if ( sscanf(argv[2], "%d", &port) != 1 ) {
fprintf(stderr, "invalid tcp port \"%s\"\n", argv[2]);
return -2;
}
}
int buf_size = 1024 * 32;
if ( argc > 3 ) {
if ( sscanf(argv[3], "%d", &buf_size) != 1 ) {
fprintf(stderr, "invalid buffer size \"%s\"\n", argv[3]);
return -3;
}
}
LPBYTE buf = new BYTE[buf_size];
if ( NULL == buf ) {
perror("allocate buffer");
return -4;
}
for ( int i = 0; i < buf_size; i++ )
buf[i] = (BYTE)i;
printf("packet size %d\n", buf_size);
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( INVALID_SOCKET == s ) {
perror("creat TCP socket");
return -5;
}
int send_buf_size = buf_size * 2 + 1024 * 32;
int err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&send_buf_size, sizeof(send_buf_size));
if ( err < 0 ) {
perror("set socket send buffer size");
return -6;
}
// connect to remote
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr = ip;
sa.sin_port = htons(port);
err = connect(s, (struct sockaddr*)&sa, sizeof(sa));
if ( err < 0 ) {
perror("connect failed");
return -6;
}
// send loop
int stat_bytes = 0;
DWORD stat_last_time = timeGetTime();
while ( !_kbhit() ) {
#ifdef USE_SELECT
FD_SET fdw;
FD_ZERO(&fdw);
FD_SET(s, &fdw);
struct timeval tv = {0, 50000}; // 50ms
err = select(0, NULL, &fdw, NULL, &tv);
if ( err < 0 )
break;
if ( err > 0 && FD_ISSET(s, &fdw) )
#endif/*USE_SELECT*/
{
err = send(s, (char*)buf, buf_size, 0);
if ( err < 0 ) {
perror("send");
return -7;
}
stat_bytes += err;
}
// Stat.
DWORD time_now = timeGetTime();
DWORD time_escape = time_now - stat_last_time;
if ( time_escape >= 1000 ) {
double speed_mb = (stat_bytes * 1000.0) / (time_escape * 1024.0 * 1024.0);
printf("send %.1fKB in %.1fs, speed is %.1fMB/s\n", stat_bytes / 1024.0, time_escape / 1000.0, speed_mb);
stat_last_time = time_now;
stat_bytes = 0;
}
}
delete []buf;
return 0;
}
int tcp(int argc, char* argv[])
{
printf("tcp:\n");
++argv;
--argc;
if ( argc > 0 ) {
if ( stricmp(argv[0], "--help") == 0 || stricmp(argv[0], "-h") == 0 ) {
} else if ( stricmp(argv[0], "recv") == 0 ) {
return tcp_recv(argc, argv);
} else if ( stricmp(argv[0], "send") == 0 ) {
return tcp_send(argc, argv);
} else {
fprintf(stderr, "invalid parameter \"%s\"!\n", argv[0]);
}
}
fprintf(stderr, "testnet tcp recv [<bind port> [<buffer size>]]\n");
fprintf(stderr, "testnet tcp send [<remote ip> <remote port> [<buffer size>]]\n");
return 0;
}