送2个的TCP数据包是可以发送2个连续的TCP数据包出在这张照片在这里看到:如何在C++
我目前没有设置TCP_NODELAY为true,SO_SNDBUF为0。我也呼吁发送在我的程序2x中。这是我得到的结果:
这里的主要问题将是延迟ACK导致在第二截图降低网络性能。
服务器的代码:
DWORD WINAPI ServerHandler(void *lp){
//The port you want the server to listen on
int host_port = 1852;
//Initialize socket support WINDOWS ONLY!
unsigned short wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0 || (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2))
{
printf("Could not find useable sock dll %d\n",WSAGetLastError());
return 0;
}
//Initialize sockets and set any options
int hsock;
BOOL bOptVal = true;
int bOptLen = sizeof (BOOL);
int iResult = 0;
hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(hsock == INVALID_SOCKET)
{
printf("Error initializing socket %d\n",WSAGetLastError());
return 0;
}
iResult = setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char *) &bOptVal, bOptLen);
if (iResult == SOCKET_ERROR)
printf("setsockopt for SO_REUSEADDR failed with error: %d\n", WSAGetLastError());
else
printf("Set SO_REUSEADDR: ON\n");
iResult = setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
if (iResult == SOCKET_ERROR)
printf("setsockopt for SO_KEEPALIVE failed with error: %d\n", WSAGetLastError());
else
printf("Set SO_KEEPALIVE: ON\n");
//Bind and listen
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET ;
my_addr.sin_port = htons(host_port);
memset(&(my_addr.sin_zero), 0, 8);
my_addr.sin_addr.s_addr = INADDR_ANY ;
if(bind(hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == SOCKET_ERROR)
{
printf("Error binding to socket, make sure nothing else is listening on this port %d\n",WSAGetLastError());
closesocket(hsock);
return 0;
}
if(listen(hsock, MAXCONN) == SOCKET_ERROR)
{
printf("Error listening %d\n",WSAGetLastError());
closesocket(hsock);
return 0;
}
//Now lets to the server stuff
int* csock;
sockaddr_in sadr;
int addr_size = sizeof(SOCKADDR);
printf("waiting for a connection\n");
while(true)
{
csock = (int*)malloc(sizeof(int));
if((*csock = accept(hsock, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET)
{
printf("Received connection from %s, %u @ socket %d\n", inet_ntoa(sadr.sin_addr), sadr.sin_port, *csock);
BOOL bOptVal = true;
int iResult = setsockopt(*csock, SOL_SOCKET, TCP_NODELAY, (char *) &bOptVal, sizeof(bOptVal));
if (iResult == SOCKET_ERROR)
printf("setsockopt for TCP_NODELAY failed with error: %d\n", WSAGetLastError());
else
printf("Set TCP_NODELAY: TRUE\n");
int sendBuf = 0;
iResult = setsockopt(*csock, SOL_SOCKET, SO_SNDBUF, (char *) &sendBuf, sizeof(sendBuf));
if (iResult == SOCKET_ERROR)
printf("setsockopt for SO_SNDBUF failed with error: %d\n", WSAGetLastError());
else
printf("Setsockopt for SO_SNDBUF set to 0\n");
CreateThread(0,0,&SocketHandler, (void*)csock , 0,0);
}
else
{
printf("Error accepting %d\n",WSAGetLastError());
}
}
WSACleanup();
}
我用于发送数据的代码:
int send_TCP_2(int cs, char responseLength[], char data[], int respond_length, int data_length)
{
int size = respond_length + data_length;
int index = 0;
// combined 10 byte response with data as 1 packet
std::vector<char> packet(size);
for(int i=0; i<respond_length; i++)
{
packet[index] = responseLength[i];
index++;
}
for(int i=0; i<data_length; i++)
{
packet[index] = data[i];
index++;
}
int status;
char *data_ptr = &packet[0];
while(size > 0)
{
status = send(cs, data_ptr, size, 0);
if(status > 0)
{
data_ptr += status;
size -= status;
}
else if (status == SOCKET_ERROR)
{
int error_code = WSAGetLastError();
printf("send_TCP_2 failed with error code: %d\n", error_code);
return 0; // send failed
}
}
return 1; // send successful
}
我附上截图时,我不禁内格尔和不触摸SO_SNDBUF。
是什么让你觉得包(而不是别的东西)的大小是影响网络性能?来自同一对网络中同一台计算机的两张屏幕截图吗? – 2012-03-15 03:05:41
'TCP_NODELAY'应该够用了。 – 2012-03-15 03:10:20
@AdamLiss哦不,我并不是说数据包的大小正在影响网络。我试图连续获取2个数据包以获得即时ACK。这将消除第二张照片中看到的200毫秒延迟。 (0.011至0.210) – user990639 2012-03-15 03:17:27