C++ C++;温索克慢
我正在尝试使用套接字发送一个2D布尔数组。这个数组是254x5,所以有1270字节大。我每秒发送两个数组,从50到100次。这可能不是带宽问题,因为它也发生在LAN和127.0.0.1上,当刷新率(阵列每秒发送的次数)为100、50甚至30时,接收阵列所需的时间是相同的 以下是要发送的代码:C++ C++;温索克慢,c++,arrays,sockets,tcp,winsock,C++,Arrays,Sockets,Tcp,Winsock,我正在尝试使用套接字发送一个2D布尔数组。这个数组是254x5,所以有1270字节大。我每秒发送两个数组,从50到100次。这可能不是带宽问题,因为它也发生在LAN和127.0.0.1上,当刷新率(阵列每秒发送的次数)为100、50甚至30时,接收阵列所需的时间是相同的 以下是要发送的代码: if (Socket == INVALID_SOCKET) { std::cout << "Winsock error - Socket creation Failed!\r\n";
if (Socket == INVALID_SOCKET)
{
std::cout << "Winsock error - Socket creation Failed!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
std::cout << "Enter Ip Address : ";
char ipaddress[20];
std::cin >> ipaddress;
std::cout << "Enter port number : ";
int portnumber;
std::cin >> portnumber;
struct hostent *host;
if ((host = gethostbyname(ipaddress)) == NULL)
{
std::cout << "Failed to resolve hostname.\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
SOCKADDR_IN SockAddr;
SockAddr.sin_port = htons(portnumber);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
// Attempt to connect to server
if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0)
{
std::cout << "Failed to establish connection with server\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
int res = send(Socket, (char*)&refresh, sizeof(refresh), 0);
if (res == sizeof(refresh))
std::cout << "Refresh sent.";
else
{
std::cout << res << " :("<<std::endl;
std::cout<<WSAGetLastError();
}
char tr = 1;
setsockopt(Socket, IPPROTO_TCP, TCP_NODELAY, &tr, sizeof(tr));
在此接受:
SOCKADDR_IN serverInf;
serverInf.sin_family = AF_INET;
serverInf.sin_addr.s_addr = INADDR_ANY;
serverInf.sin_port = htons(8000);
int Socket = socket(PF_INET, SOCK_STREAM, 0);
if (Socket == INVALID_SOCKET)
{
std::cout << "Winsock error - Socket creation Failed!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
if (bind(Socket, (SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR)
{
std::cout << "Unable to bind socket!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
listen(Socket, 1);
SOCKET TempSock = SOCKET_ERROR;
SOCKADDR taddr;
while (TempSock == SOCKET_ERROR)
{
std::cout << "Waiting for incoming connections...\r\n";
TempSock = accept(Socket, &taddr, NULL);
}
Socket = TempSock;
std::cout << "Client connected!\r\n\r\n";
int refresh;
char* pass;
char tr = 1;
setsockopt(Socket, IPPROTO_TCP, TCP_NODELAY, &tr, sizeof(tr));
recv(sock, (char*)&t, sizeof t, MSG_WAITALL);
现在我知道有些人会说1270字节,每秒200次太多了。是的,可能是因为它需要240 kb/s。但我的问题不是这样。我的问题是发送单个数组需要半秒钟。任务管理器说我只使用了1,6kb/s。为什么winsock不使用所有的bandwitdh,即使我使用127.0.0.1?我还对这两个程序应用了TCP\u NODELAY:
setsockopt(Socket, IPPROTO_TCP, TCP_NODELAY, &tr, sizeof(tr));
有人知道为什么会这样?我应该使用UDP吗?提前感谢请展示一些真实的代码,而不仅仅是无法编译的代码片段。但是你可能应该先看看WireShark,看看它是如何打包发送的。好吧,开始编辑..哦,你对
char
和int
的使用可能是个问题:这是首选方式:inti=1;setsockopt(iSock、IPPROTO_TCP、TCP_NODELAY、(char*)&i、sizeof(i))
首选方法是永远不要忽略错误检查的需要:)
setsockopt(Socket, IPPROTO_TCP, TCP_NODELAY, &tr, sizeof(tr));