多个线程写入同一个套接字导致问题

Multiple threads writing to same socket causing issues

本文关键字:套接字 问题 同一个 线程      更新时间:2023-10-16

我写了一个客户端/服务器应用程序,其中服务器根据来自客户端的请求产生多个线程。

这些线程被期望发送一些数据给客户端(字符串)。

问题是,数据在客户端被覆盖。如何解决这个问题?

我已经读了一些关于类似问题的其他线程,但无法找到确切的解决方案。

这是我的客户端代码接收数据。

while(1)
    {
            char buff[MAX_BUFF];
            int bytes_read = read(sd,buff,MAX_BUFF);
            if(bytes_read == 0)
            {
                    break;
            }
            else if(bytes_read > 0)
            {
                    if(buff[bytes_read-1]=='$')
                    {
                            buff[bytes_read-1]='';
                            cout<<buff;
                    }
                    else
                    {
                            cout<<buff;
                    }
            }
    }
服务器线程代码:
void send_data(int sd,char *data)
{
    write(sd,data,strlen(data));
    cout<<data;
}
void *calcWordCount(void *arg)
{
    tdata *tmp = (tdata *)arg;
    string line = tmp->line;
    string s = tmp->arg;
    int sd = tmp->sd_c;
    int line_no = tmp->line_no;
    int startpos = 0;
    int finds = 0;
    while ((startpos = line.find(s, startpos)) != std::string::npos)
    {
            ++finds;
            startpos+=1;
            pthread_mutex_lock(&myMux);
            tcount++;
            pthread_mutex_unlock(&myMux);
    }
    pthread_mutex_lock(&mapMux);
    int t=wcount[s];
    wcount[s]=t+finds;
    pthread_mutex_unlock(&mapMux);

    char buff[MAX_BUFF];
    sprintf(buff,"%s",s.c_str());
    sprintf(buff+strlen(buff),"%s"," occured ");
    sprintf(buff+strlen(buff),"%d",finds);
    sprintf(buff+strlen(buff),"%s"," times on line ");
    sprintf(buff+strlen(buff),"%d",line_no);
    sprintf(buff+strlen(buff),"n",strlen("n"));
    send_data(sd,buff);
    delete (tdata*)arg;
}
    在服务器端,确保共享资源(套接字及其相关的内部缓冲区)受到保护,防止并发访问。
  1. 定义并实现服务器使用的应用层协议,使客户端能够区分不同线程发送的内容。

作为一个额外的注意:不能依赖read()/write()读取/写入与这两个函数被告知读取/写入相同的字节。检查它们的返回值以了解这些函数实际读/写了多少字节,并循环它们,直到所有打算读/写的数据都被读/写完,这是非常必要的。

你应该给你的套接字添加一些互斥。

当一个线程使用套接字时,它应该阻塞套接字。

一些互斥锁的例子。

没有服务器代码,我无法帮助你更多。因为问题可能出在服务器上