Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++;多客户端TCP服务器 我想用C++开发一个带有TCP协议的服务器和客户端程序。服务器必须能够同时处理多个客户端。但问题是,例如,启动服务器后,我运行了两个客户端,服务器的IP地址和端口作为参数。接下来,两个客户端都向服务器发送数据。首先,两个客户端都可以向服务器发送数据,服务器可以读取数据。但是,一旦服务器从第二个客户端接收到数据,它似乎就停止了从第一个客户端接收数据。你有什么解决办法吗_C++_Sockets_Tcp - Fatal编程技术网

C++;多客户端TCP服务器 我想用C++开发一个带有TCP协议的服务器和客户端程序。服务器必须能够同时处理多个客户端。但问题是,例如,启动服务器后,我运行了两个客户端,服务器的IP地址和端口作为参数。接下来,两个客户端都向服务器发送数据。首先,两个客户端都可以向服务器发送数据,服务器可以读取数据。但是,一旦服务器从第二个客户端接收到数据,它似乎就停止了从第一个客户端接收数据。你有什么解决办法吗

C++;多客户端TCP服务器 我想用C++开发一个带有TCP协议的服务器和客户端程序。服务器必须能够同时处理多个客户端。但问题是,例如,启动服务器后,我运行了两个客户端,服务器的IP地址和端口作为参数。接下来,两个客户端都向服务器发送数据。首先,两个客户端都可以向服务器发送数据,服务器可以读取数据。但是,一旦服务器从第二个客户端接收到数据,它似乎就停止了从第一个客户端接收数据。你有什么解决办法吗,c++,sockets,tcp,C++,Sockets,Tcp,这是服务器代码 using namespace std; void *task1(void *); static int connFd; void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char* argv[]) { int pId, portNo, listenFd; socklen_t len; //store size of the address

这是服务器代码

using namespace std;

void *task1(void *);

static int connFd;
void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char* argv[])
{
    int pId, portNo, listenFd;
    socklen_t len; //store size of the address
    bool loop = false;
struct sockaddr_in svrAdd, clntAdd;

pthread_t threadA[3];

if (argc < 2)
{
    cerr << "Syntam : ./server <port>" << endl;
    return 0;
}

portNo = atoi(argv[1]);

if((portNo > 65535) || (portNo < 2000))
{
    cerr << "Please enter a port number between 2000 - 65535" << endl;
    return 0;
}

//create socket
listenFd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

if(listenFd < 0)
{
    cerr << "Cannot open socket" << endl;
    return 0;
}

bzero((char*) &svrAdd, sizeof(svrAdd));

svrAdd.sin_family = AF_INET;
svrAdd.sin_addr.s_addr = INADDR_ANY;
svrAdd.sin_port = htons(portNo);

//bind socket
if(bind(listenFd, (struct sockaddr *)&svrAdd, sizeof(svrAdd)) < 0)
{
    cerr << "Cannot bind" << endl;
    return 0;
}

    listen(listenFd, 5);

    int noThread = 0;

    while (noThread < 3)
    {
        socklen_t len = sizeof(clntAdd);
        cout << "Listening" << endl;

    //this is where client connects. svr will hang in this mode until           client conn
        connFd = accept(listenFd, (struct sockaddr *)&clntAdd, &len);

        if (connFd < 0)
        {
            cerr << "Cannot accept connection" << endl;
            return 0;
        }
        else   
        {
            cout << "Connection successful" << endl;
        }

        pthread_create(&threadA[noThread], NULL, task1, NULL); 

        noThread++;
    }

    for(int i = 0; i < 3; i++)
    {
        pthread_join(threadA[i], NULL);
    }  
}

void *task1 (void *dummyPt)
{
    cout << "Thread No: " << pthread_self() << endl;
    char test[256];
    bzero(test, 256);
    bool loop = false;
    while(!loop)
    {       
        bzero(test, 256);     
        int n = read(connFd, test, 255);
        if (n < 0) error("ERROR reading from socket");
        printf("Here is the message: %s\n",test);            
    }
    cout << "\nClosing thread and conn" << endl;
    close(connFd);
}
使用名称空间std;
作废*任务1(作废*);
静态int-connFd;
无效错误(常量字符*消息)
{
佩罗尔(味精);
出口(1);
}
int main(int argc,char*argv[])
{
int-pId,端口号,listenFd;
socklen\u t len;//存储地址的大小
布尔循环=假;
svrAdd中的结构sockaddr_,clntAdd;
pthread_t threadA[3];
如果(argc<2)
{

cerrYor
connFd
是一个全局变量,您可以从主线程和所有处理线程访问它。这不行!想象一下-您已经接受了第一个连接,并将变量设置为接收套接字。您已经生成了处理线程,该线程开始读取。接下来,您知道,另一个连接将出现在您也正在接收它!此时
connFd
指向新连接,因此已经在使用它的线程将突然切换到新连接!当然这不是好的

修复这个问题的方法是将连接传递到线程,这样线程之间不共享。最简单的方法是使用C++线程类。 例如,这是说明上述想法的代码片段:

void handle_connection(int fd) {
   ... <your task1 code>
}

... 
std::vector<std::thread> threads;
...
int conn = accept(listenFd, (struct sockaddr *)&clntAdd, &len);
threads.push_back(std::thread(&handle_connection, conn));
...

... (in the end)
for (auto&& t : threads)
    t.join();
void handle\u连接(int-fd){
... 
}
... 
向量线程;
...
int conn=accept(listenFd,(struct sockaddr*)和clntAdd,&len);
threads.push_back(std::thread(&handle_connection,conn));
...
…(最后)
用于(自动(&t:线程)
t、 join();

在执行您的建议后,我遇到了一些错误。请查看我的更新。您得到了原始问题的答案。尝试执行该答案会导致您出现新错误。您不应该通过添加错误来破坏您的帖子,因为这些错误在帖子中仍然存在的原始问题的上下文中毫无意义。相反,针对错误发布一个新问题。我已将问题编辑回如何保持答案的完整性
void handle_connection(int fd) {
   ... <your task1 code>
}

... 
std::vector<std::thread> threads;
...
int conn = accept(listenFd, (struct sockaddr *)&clntAdd, &len);
threads.push_back(std::thread(&handle_connection, conn));
...

... (in the end)
for (auto&& t : threads)
    t.join();