多个线程写入同一个套接字导致问题
Multiple threads writing to same socket causing issues
我写了一个客户端/服务器应用程序,其中服务器根据来自客户端的请求产生多个线程。
这些线程被期望发送一些数据给客户端(字符串)。
问题是,数据在客户端被覆盖。如何解决这个问题?
我已经读了一些关于类似问题的其他线程,但无法找到确切的解决方案。
这是我的客户端代码接收数据。
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;
}
- 在服务器端,确保共享资源(套接字及其相关的内部缓冲区)受到保护,防止并发访问。
- 定义并实现服务器使用的应用层协议,使客户端能够区分不同线程发送的内容。
作为一个额外的注意:不能依赖read()
/write()
读取/写入与这两个函数被告知读取/写入相同的字节。检查它们的返回值以了解这些函数实际读/写了多少字节,并循环它们,直到所有打算读/写的数据都被读/写完,这是非常必要的。
你应该给你的套接字添加一些互斥。
当一个线程使用套接字时,它应该阻塞套接字。
一些互斥锁的例子。
没有服务器代码,我无法帮助你更多。因为问题可能出在服务器上相关文章:
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 发送和十六进制消息时套接字代码C++问题
- 通过套接字发送整数数组时出现问题
- 此函数是否对套接字有问题?
- 一些简单的套接字问题供C++
- 套接字 TCP 服务器程序问题
- poll()套接字编程tcp-linux多连接问题
- 通过套接字发送HBITMAP出现问题
- 通过套接字发送的图像流-服务器死锁问题
- 套接字和telnet出现问题
- Android NDK套接字连接问题
- 包含互斥对象C++时出现套接字问题
- 在 Linux 计算机中使用套接字发送和接收文件时C++问题
- C++套接字连接问题
- 发送/接收套接字阻塞问题
- 比较套接字地址的问题
- 套接字c++,接收信息的奇怪问题
- 提升 unix 上的 UDP 套接字问题 - 绑定:地址已在使用中
- Qt套接字问题
- 发送数据时出现套接字问题