TCP服务器问题


做一个TCP服务器,逻辑与通信分别在不同的线程中(通信线程有多个),在用ping-pong测试(连接的一方收到的消息,直接返回)时出现了一个问题:
单个连接进入时,通信没有问题,但如果有第二个连接进入(会激活另一个通信线程),这时会发现通信的数据会乱掉(比如发送的数据有三条,比如“12345”、“678910”、“aaaaaaaaa”,可能在某个时刻会接收到一条“67891”的数据)。
经以调试,发现在服务器在往缓冲区里通信队列发送数据时,函数调用堆栈上(调用参数)显示有一条“67891”的数据,于是看了下数据来源,发现数据的来源是正确的,可调用堆栈上显示是错误的,
更诡异的是再使用bt看调用堆栈时,原来错误的数据又变成了正确的

有没有朋友遇到类似的问题,求解找这个BUG的思路!

gcc版本:4.4.4
内核版本:Linux CentOS 2.6.32
语言:C++

调用堆栈截图:
第一次打出的堆栈(红色是错误的值):
图片1
这是两次打出堆栈中间打印的数据来源:
图片2
第二次打出的堆栈(红色是变成了正确的值):
图片3

TCP/IP C++

锁骨控頑駄無 12 years ago

tcp是全双工的, 也就是接受可以是一个线程,发送可以是另一个线程,但1个tcp连接只能由1个线程来接受数据,否则肯定就乱了。

出现这种问题,都改成一个线程看看吧,然后再具体分析哪出问题了。

梦里的大肉 answered 12 years ago

Your Answer