如何在不读取套接字的情况下访问写在套接字中的数据

时间:2019-06-11 13:47:36

标签: linux networking linux-kernel c

我正在使用具有Linux的嵌入式系统。 客户端线程正在向套接字中写入一些数据,但是另一端正在读取的服务器线程与所写的不同。导致线程(和父进程)崩溃。

我是网络和Linux的新手。 我已转储正在写入的所有数据,一切都很好。

gdb中的函数跟踪显示以下信息。

(gdb) 
#0  0x00007f62be8e8670 in getenv () from /lib/libc.so.6
#1  0x00007f62be92057a in __libc_message () from /lib/libc.so.6
#2  0x00007f62be99f927 in __fortify_fail () from /lib/libc.so.6
#3  0x00007f62be99f8f0 in __stack_chk_fail () from /lib/libc.so.6
#4  0x0000000000406471 in reading (sockFd=15) at __line_number_in_the_program__
#5  0x793bcf318b18bb01 in ?? ()
#6  0x117d0300942ff567 in ?? ()
#7  0x0000000100000000 in ?? ()
..
..
..

直到#785,并带有一些[随机]地址。

reading()是用于处理服务器线程中读取的数据的函数。

我怀疑套接字内部有问题。 有什么办法可以不读取套接字(客户机/服务器)缓冲区中的数据? 还是使用gdb进一步调试它的其他方法?

已经有一些检查可以正确处理读取的数据,但这些检查也无济于事。

1 个答案:

答案 0 :(得分:1)

您有堆栈缓冲区溢出问题。如果您从未听说过GCC堆栈保护器,那么现在该进行查找了。虽然Wireshark是查看飞行数据的显而易见的工具,但这不是问题的根源。您的服务器应提供针对从网络读取的所有恶意数据的证据。这是基本的良好服务器设计和实施实践。 您有堆栈缓冲区溢出问题。