Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 客户端如何从服务器检索向量列表?_C++_Visual Studio_Tcp_Client Server - Fatal编程技术网

C++ 客户端如何从服务器检索向量列表?

C++ 客户端如何从服务器检索向量列表?,c++,visual-studio,tcp,client-server,C++,Visual Studio,Tcp,Client Server,我有一个客户端应用程序,需要从任何地方连接到服务器,所以要做到这一点,我正在尝试创建一个主服务器。此主服务器将其他服务器的ip地址保存在一个向量中。然后,客户端将获得此服务器列表,并选择一个要连接的服务器。因此,基本上主服务器只需要将服务器地址传递给客户机 我需要我的客户端应用程序从主服务器访问这个向量列表,并在列表框中显示地址 那么,客户机如何从主服务器访问向量列表呢 以下是来自主服务器的代码: WSADATA wsaData; SOCKET ListeningSocket, NewConn

我有一个客户端应用程序,需要从任何地方连接到服务器,所以要做到这一点,我正在尝试创建一个主服务器。此主服务器将其他服务器的ip地址保存在一个向量中。然后,客户端将获得此服务器列表,并选择一个要连接的服务器。因此,基本上主服务器只需要将服务器地址传递给客户机

我需要我的客户端应用程序从主服务器访问这个向量列表,并在列表框中显示地址

那么,客户机如何从主服务器访问向量列表呢

以下是来自主服务器的代码:

WSADATA wsaData; 
SOCKET ListeningSocket, NewConnection; 
SOCKADDR_IN ServerAddr, SenderInfo;  quantity
int Port = 7171;
char recvbuff[1024];
int ByteReceived, i, nlen;

ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

ServerAddr.sin_family = AF_INET; 
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

std::vector<std::string> vClientIPs; // client ip string vector
while(1)
{
    NewConnection = SOCKET_ERROR;
    while(NewConnection == SOCKET_ERROR)
    {
        NewConnection = accept(ListeningSocket, NULL, NULL);
        printf("Server: New client got connected, ready to receive and send data...\n\n");
        ByteReceived = recv(NewConnection, recvbuff, sizeof(recvbuff), 0);

        if ( ByteReceived > 0 )
        {
            getsockname(ListeningSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
            printf("Server: IP(s) used by Server: %s\n", inet_ntoa(ServerAddr.sin_addr)); 
            vClientIPs.push_back(std::string(inet_ntoa(ServerAddr.sin_addr))); //insert client ip
            printf("Server: port used by Server: %d\n\n", htons(ServerAddr.sin_port));
            memset(&SenderInfo, 0, sizeof(SenderInfo));
            nlen = sizeof(SenderInfo);
            getpeername(NewConnection, (SOCKADDR *)&SenderInfo, &nlen);
            printf("Server: IP used by Client: %s\n", inet_ntoa(SenderInfo.sin_addr));
            printf("Server: Port used by Client: %d\n", htons(SenderInfo.sin_port));
            printf("Server: Bytes received: %d\n", ByteReceived);
            printf("Server: Message from client: \"");

            for(i=0;i < ByteReceived;i++)
            {
                printf("%c", recvbuff[i]);
            }
            printf("\"");
            }
            else if ( ByteReceived == 0 )
            {
                printf("Server: Connection closed!\n");
            }
            else
            {
                printf("Server: recv failed with error code: %d\n", WSAGetLastError());
            }
        }
    }
}
WSADATA-WSADATA;
SOCKET ListingSocket,新建连接;
服务器中的sockaddru addr,SenderInfo;量
int端口=7171;
char recvbuff[1024];
接收到的int bytereeve,i,nlen;
ListingSocket=socket(AF_INET、SOCK_STREAM、IPPROTO_TCP);
ServerAddr.sin_family=AF_INET;
ServerAddr.sinu端口=htons(端口);
ServerAddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
std::vector vClientIPs;//客户端ip字符串向量
而(1)
{
NewConnection=SOCKET\u错误;
while(NewConnection==SOCKET\u错误)
{
NewConnection=accept(listengsocket,NULL,NULL);
printf(“服务器:新客户端已连接,准备接收和发送数据…\n\n”);
ByteReceived=recv(NewConnection,recvbuff,sizeof(recvbuff),0);
如果(ByteReceived>0)
{
getsockname(listengsocket,(SOCKADDR*)和ServerAddr,(int*)sizeof(ServerAddr));
printf(“服务器:服务器使用的IP:%s\n”,inet_ntoa(ServerAddr.sin_addr));
vClientIPs.push_back(std::string(inet_ntoa(ServerAddr.sin_addr));//插入客户端ip
printf(“服务器:服务器使用的端口:%d\n\n”,htons(ServerAddr.sin_port));
memset(&SenderInfo,0,sizeof(SenderInfo));
nlen=sizeof(SenderInfo);
getpeername(新连接,(SOCKADDR*)和SenderInfo,&nlen);
printf(“服务器:客户端使用的IP:%s\n”,inet_ntoa(SenderInfo.sin_addr));
printf(“服务器:客户端使用的端口:%d\n”,htons(SenderInfo.sinu-Port));
printf(“服务器:接收的字节数:%d\n”,ByteReceived);
printf(“服务器:来自客户端的消息:\”);
for(i=0;i
以下是客户端代码:

WSADATA wsaData;
SOCKET SendingSocket;
SOCKADDR_IN ServerAddr, ThisSenderInfo;
unsigned int Port = 7171;
int RetCode;

char sendbuf[1024] = "This is a test string from client";
int BytesSent, nlen;

WSAStartup(MAKEWORD(2,2), &wsaData);
SendingSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

ClientInfo info;
info.addr = inet_ntoa(ServerAddr.sin_addr); //push address onto listbox

RetCode = connect(SendingSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
getsockname(SendingSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));

BytesSent = send(SendingSocket, sendbuf, strlen(sendbuf), 0);

if(BytesSent == SOCKET_ERROR)
{
    AfxMessageBox("Send error %ld.\n", WSAGetLastError());
}
else
{
    memset(&ThisSenderInfo, 0, sizeof(ThisSenderInfo));
    nlen = sizeof(ThisSenderInfo);

    getsockname(SendingSocket, (SOCKADDR *)&ThisSenderInfo, &nlen);         

}

Mutex<CriticalSection>::Lock lock(client_cs);
clients.push_back(info);
WSADATA-WSADATA;
插座发送插座;
服务器addr中的sockaddru,ThisSenderInfo;
无符号整数端口=7171;
int-RetCode;
char sendbuf[1024]=“这是来自客户端的测试字符串”;
int BytesSent,nlen;
WSAStartup(MAKEWORD(2,2)和wsaData);
SendingSocket=socket(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
ServerAddr.sin_family=AF_INET;
ServerAddr.sinu端口=htons(端口);
ServerAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
ClientInfo信息;
info.addr=inet\u ntoa(ServerAddr.sin\u addr)//将地址推到列表框上
RetCode=connect(SendingSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
getsockname(SendingSocket,(SOCKADDR*)和ServerAddr,(int*)sizeof(ServerAddr));
BytesSent=send(SendingSocket,sendbuf,strlen(sendbuf),0);
if(BytesSent==SOCKET\u错误)
{
AfxMessageBox(“发送错误%ld。\n”,WSAGetLastError());
}
其他的
{
memset(&ThisSenderInfo,0,sizeof(ThisSenderInfo));
nlen=sizeof(ThisSenderInfo);
getsockname(SendingSocket,(SOCKADDR*)和ThisSenderInfo,&nlen);
}
互斥锁:锁锁(客户端);
客户端。推回(信息);

现在,客户机只是连接到本地机器上的服务器,它只显示一个地址(我将其发送到的地址)。如何获取保存在向量中的地址并显示它?

在服务器端迭代向量并发送数据(每个字符串的原始字节)。使用双精度“0”终止它,以便知道您在客户端接收时到达了终点。
我真的怀疑您是否有太多的数据,但如果您有,请在发送之前先压缩数据,然后在另一端对其进行解压缩。

我将如何发送/接收数据?仅当客户端应用程序连接到serversend()/recv()时,才需要发送数据?如果您有非阻塞套接字等,可能与select()结合使用。。。当新客户端连接时,将矢量内容发送给他。就是这样,发送代码是什么样子的?我尝试了vClientIPs=send(listingsocket,recvbuff,(int)strlen(recvbuff),0);但是它不起作用,我想你应该把数据发送到“NewConnection”套接字。顺便说一句,strlen()将返回不带终止空字符的大小。因此,如果您有更多字符串,它们将连接到客户端。同时发送空字符,并确保末尾有2个空字符。这样你就知道你已经到了终点。