我正在开发一个有两个客户端的项目,一个用于发送,另一个用于接收 udp 数据报,两台机器之间直接相互连接。每个数据报大小为1024byte,使用winsock(阻塞)发送。它们都在非常快的机器上运行(单独的)。配备 16GB RAM 和 8 个 CPU,配备 raid 0 驱动器。
我正在寻找最大化我的吞吐量的技巧,技巧应该是winsock级别的,但如果你有其他一些技巧,那也很棒。
目前我的传输速度为 250-400mbit。我正在寻找更多。
谢谢。
我正在使用 I/O-Completion Port 编写一个小的服务器-客户端的东西。
我通过我的完成端口通过 AcceptEx 成功连接了服务器和客户端。客户端连接后,客户端套接字与完成端口相关联,并在该套接字上调用对 WSARecv 的重叠调用。
一切正常,直到我关闭客户端测试程序。
GetQueuedCompletionStatus()退货FALSE和GetLastError退货
ERROR_NETNAME_DELETED
,这对我来说很有意义(在我阅读了 MSDN 上的描述之后)。
但我的问题是,我认为调用GetQueuedCompletionStatus会返回一个数据包,表明由于套接字关闭而失败,因为WSARecv会返回适当的返回值。由于情况并非如此,我不知道哪个客户端的套接字导致了错误并且无法按照我需要的方式行事(释放结构,清理此特定连接等)...
关于如何解决这个问题的任何建议或提示?
谢谢:)
编辑:http : //codepad.org/WeYINasO <- 负责的代码......“错误”发生在 while 循环的第一个函数开始处(对它的调用GetCompletionStatus()只是 GetQueuedCompletionStatus() 工作正常的包装器其他情况)[确实把它贴在那里,因为它在这里看起来又脏又乱]
你好我有一个套接字服务器和客户端的问题.
问题是,当我发送消息时,消息会混淆.当我发送它们让我们说每秒1条消息一切都运行良好,但当我每40毫秒发送一条消息时,它们会混淆.
这是我收到的代码:
std::string* AteneaClient::readSocket () {
std::string finalString = std::string("");
int size = MSG_SIZE;
bool receiving = true;
int timesBufferInc=0;
while (receiving) {
std::string temporalString;
//create an empty buffer
char* RCV_BUFFER = (char*) malloc (size* sizeof(char));
for(int i=0;i<size;i++){
RCV_BUFFER[i]=' ';
}
RCV_BUFFER[size-1]='\0';
int result = recv(sock,RCV_BUFFER,size-1,NULL);
if ( result== SOCKET_ERROR ) {
free(RCV_BUFFER);
return NULL;
}
else if(result<size-1){
receiving=false;
}
temporalString = std::string(RCV_BUFFER);
finalString+=temporalString;
}
return new std::string(finalString);
Run Code Online (Sandbox Code Playgroud)
}
这是我发送的代码:
int sendThread(void* data){
SND_THREAD_DATA* parameters =(SND_THREAD_DATA*)data;
SOCKET* individualSocket = …Run Code Online (Sandbox Code Playgroud) 我正在致力于实现一个 C++ 客户端服务器聊天程序以了解更多/练习套接字编程。我正在使用winsockV2。
\n\n简而言之,\n客户端程序连接到服务器,服务器将客户端套接字存储在向量中\n客户端程序发送消息让服务器分发到向量中的其他客户端。
\n\n我认为我遇到的问题是客户端和服务器正在接收消息并将其存储在 a 中,char message[256]如果消息短于 256,当我std::cout << message;被告知未初始化内存时,会显示奇怪的字符。这是输出的示例:
k:message from client to other client\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0\xe2\x95\xa0(\xe2\x96\xa0o\nRun Code Online (Sandbox Code Playgroud)\n\n有没有某种方法可以创建接收消息大小的字符数组?IE
\n\nchar recvMessage[4096];\nint s = recv(socket, recvMessage, sizeof(recvMessage),0);\nchar recvOutput[strlen(recvMessage)] = recvMessage;\nstd::cout << recvOutput << std::endl;\nRun Code Online (Sandbox Code Playgroud)\n\nrecv否则,对于您不知道长度的消息,您的解决方案是什么?
如果我是个彻头彻尾的白痴,请客气一点,我来自 PHP。课程如下:
\n\n查看receiveMessages()和distributeMessages()功能
#include "stdafx.h"\n#include "svr.h"\n\nsvr::svr()\n{\n //WSA Business I don\'t understand\n WORD wVersionRequested;\n WSADATA wsaData;\n int err;\n\n /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 connect() 函数设置我自己的时间。
我的代码适用于这样的默认连接:
bool connectFUNC4(char * ipaddr) {
WSADATA wsa;
struct sockaddr_in server;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return false;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
return false;
server.sin_addr.s_addr = inet_addr(ipaddr);
server.sin_family = AF_INET;
server.sin_port = htons(5577);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我理解阻塞和不阻塞连接的想法,我找到了设置为非阻塞模式和超时的解决方案。它总是成功完成,但通信不起作用。
bool connectFUNC3(char * ipaddr) {
WSADATA wsa;
struct sockaddr_in server;
server.sin_addr.s_addr = inet_addr(ipaddr);
server.sin_family = AF_INET;
server.sin_port = htons(5577);
unsigned long block = 1;
ioctlsocket((unsigned …Run Code Online (Sandbox Code Playgroud) 有人可以,请向我解释为什么string我使用的变量ostringstream无法通过套接字发送?
std::ostringstream oss1;
std::ostringstream oss2;
int code = 52;
oss1 << "4" << "1" << "0" << "0" << "0" << "0" << 224 + code / 16 << code % 16;
oss2 << "4" << "0" << "0" << "0" << "0" << "0" << 224 + code / 16 << code % 16;
int msg_len3 = oss1.tellp;
int msg_len4 = oss2.tellp;
std::string var1 = oss1.str();
std::string var2 = oss2.str();
comm_send1 = send(sock, var1, msg_len3, …Run Code Online (Sandbox Code Playgroud) 我可以发送文件的简单服务器和客户端,并且我需要你们看看此源是否已完成。因为我认为它不会下载完整文件。
也许对此来源有限制?因为我上传/下载了200K,还有更多..
服务器:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
SOCKET Socket, Sub;
WSADATA Winsock;
sockaddr_in Addr;
int Addrlen = sizeof(sockaddr_in);
char Buffer[256];
char *Str;
sockaddr_in IncomingAddress;
int AddressLen = sizeof(IncomingAddress);
int main()
{
WSAStartup(MAKEWORD(2, 2), &Winsock); // Start Winsock
if(LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) // Check version
{
WSACleanup();
return 0;
}
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ZeroMemory(&Addr, sizeof(Addr));
Addr.sin_family = AF_INET;
Addr.sin_port = htons(6091);
bind(Socket, (sockaddr*)&Addr, sizeof(Addr));
if(listen(Socket, 1) == SOCKET_ERROR)
{
printf("listening error\n"); …Run Code Online (Sandbox Code Playgroud) 以下代码返回计算机的第一个TCP/IP连接的IP地址.
uses WinSock;
// ...
function GetLocalIP() : String;
var
addr: TSockAddrIn;
phe: PHostEnt;
szHostName: array[0..128] of Char;
socketData: TWSADATA;
begin
Result := '127.0.0.1';
// Initialize the socket API
if (WSAStartup($101, socketData) = 0) then
begin
// Get local machine name
if (GetHostName(szHostName, 128) = SOCKET_ERROR) then
Exit;
// Use name to find IP address
phe := GetHostByName(szHostName);
if (phe = nil) then
Exit;
addr.sin_addr.S_addr := Longint(PLongint(phe^.h_addr_list^)^);
// Convert IP address to PChar format
Result := inet_ntoa(addr.sin_addr);
end;
end;
// …Run Code Online (Sandbox Code Playgroud) 我在winsock2中做了一个简单的服务器客户端控制台聊天框.然后我的同事问我是否可以进行单服务器多客户端连接,其中SERVER将在TCP中,而CLIENTS将在UDP中.此外,客户端不知道服务器的IP但知道端口号,即客户端必须搜索服务器然后连接它.所有这些都通过LAN.
任何人都可以告诉我如何做这样的程序,或者如果可能的话可以发布代码供参考.
我试图从另一台计算机公开连接到我的电脑,它10060从连接功能返回错误代码.
当我从本地机器bind的服务器与inet_addr("127.0.0.1")客户端连接,它的工作原理.
我试图用下面相同的客户端代码连接服务器的公共IP,它10060可以回复任何人的帮助吗?
服务器
#include<winsock2.h>
int main(){
WSADATA ws;
SOCKET s, newSocket;
struct sockaddr_in server, client;
int c;
if(WSAStartup(MAKEWORD(2,2), &ws) != 0){
puts("error wsastartup");
printf("wsa error at %d", GetLastError());
}
if((s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
printf("socket error at %d", GetLastError());
}
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(8888);
server.sin_family = AF_INET;
if(bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR){
printf("socket error at %d", GetLastError());
}else{
puts("bind done");
}
listen(s, 3);
puts("Waiting for incoming connections");
c …Run Code Online (Sandbox Code Playgroud)