gpt4 book ai didi

C++ 套接字 - 服务器不接受多个客户端 (linux)

转载 作者:IT王子 更新时间:2023-10-29 00:31:57 24 4
gpt4 key购买 nike

我有可用的服务器和客户端代码。服务器和客户端可以正确连接和聊天。但是,当我打开另一个客户端时,客户端显示 Awaiting confirmation from the server 而没有其他任何内容。虽然服务器和客户端 #1 仍然可以聊天。

我搜索了多线程,但它们显示的示例或代码片段是高级的。也许一点解释或一个例子会有很大帮助!

下面的代码是有效的。我有一台工作服务器,但它只接受一个连接。如何使服务器允许多个连接?这样我就可以让程序看起来像群聊。

client.cpp(当客户端 #2 连接时,代码在第 40 行卡住)

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main()
{
char a;
int client;
int portNum = 1500;
int bufsize = 1024;
char* buffer = new char[bufsize];
bool isExit = false;
char* ip = "127.0.0.1";

struct sockaddr_in direc;

if ((client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
cout << "\nError creating socket..." << endl;
exit(0);
}

cout << "\nSocket created successfully..." << endl;
direc.sin_family = AF_INET;
direc.sin_port = htons(portNum);
inet_pton(AF_INET, ip, &direc.sin_addr);

if (connect(client,(struct sockaddr *)&direc, sizeof(direc)) == 0)
cout << "Connection to the server " << inet_ntoa(direc.sin_addr) << endl;

cout << "Awaiting confirmation from the server..." << endl; //line 40
recv(client, buffer, bufsize, 0);

cout << "\n=> Enter # to terminate the connection\n" << endl;

do {
cout << "Client: ";
do {
cin >> buffer;
send(client, buffer, bufsize, 0);
if (*buffer == '#') {
send(client, buffer, bufsize, 0);
*buffer = '*';
isExit = true;
}
} while (*buffer != 42);

cout << "Server: ";
do {
recv(client, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer = '*';
isExit = true;
}

} while (*buffer != 42);
cout << endl;

} while (!isExit);
cout << "=> Connection terminated.\nGoodbye";

close(client);
return 0;
}

服务器.cpp

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main()
{
int client, server;
int bufsize = 1024;
int portNum = 1500;
bool isExit = false;
char* buffer = new char[bufsize];

struct sockaddr_in direc;
socklen_t tamano;
pid_t pid;

if ((client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
cout << "\nError establishing socket..." << endl;
exit(1);
}

cout << "\nSocket server has been created..." << endl;

direc.sin_family = AF_INET;
direc.sin_addr.s_addr = htons(INADDR_ANY);
direc.sin_port = htons(portNum);

if ((bind(client, (struct sockaddr*)&direc,sizeof(direc))) < 0) {
cout << "\nError binding connection..." << endl;
return -1;
}

tamano = sizeof(direc);
cout << "Looking for clients..." << endl;
listen(client, 1);

while ((server = accept(client,(struct sockaddr *)&direc,&tamano)) > 0) {
strcpy(buffer, "Server connected...\n");
send(server, buffer, bufsize, 0);
cout << "Connected with the client, you are good to go..." << endl;
cout << "Enter # to end the connection\n" << endl;

cout << "Client: ";
do {
recv(server, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer = '*';
isExit = true;
}
} while (*buffer != '*');

do {
cout << "\nServer: ";
do {
cin >> buffer;
send(server, buffer, bufsize, 0);
if (*buffer == '#') {
send(server, buffer, bufsize, 0);
*buffer = '*';
isExit = true;
}
} while (*buffer != '*');

cout << "Client: ";
do {
recv(server, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer == '*';
isExit = true;
}
} while (*buffer != '*');
} while (!isExit);

cout << "\n=> Connection terminated... " << inet_ntoa(direc.sin_addr);
close(server);
cout << "\nGoodbye..." << endl;
isExit = false;
}

close(client);
return 0;
}

如何让服务器接受多重连接?

谢谢!

最佳答案

为了正确支持多个连接,您应该为每个传入连接启动一个新线程。每个新连接都由 accept() 返回的它自己唯一的套接字描述符标识。一个简单的例子:

while ((accepted = accept(client,(struct sockaddr *)&direc,&tamano)) > 0) {
/*Create the thread and pass the socket descriptor*/
if( pthread_create(new_thread, &thread_attributes, &handle_tcp_connection, (void *)accepted) != 0){
perror("create thread");
exit(EXIT_FAILURE);
}
}

关于C++ 套接字 - 服务器不接受多个客户端 (linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com