所以,我有两个主题.
线程1管理客户端连接.(只有一个客户端和一个服务器)
我称之为我的服务器线程.
线程二管理向客户端发送消息.我称之为消息处理器线程.
线程1负责,除其他外,定期向客户端发送心跳.
在编程时我假设套接字不是线程安全的,但缓冲区是,并且只要我使用单独的缓冲区用于服务器和处理器线程我就没问题了.
我还假设"PrintWriter"类似于Java中的套接字缓冲区.
在这些假设下,我写了这个函数来发送心跳:
public void sendHeartBeat(){
logger.info("Sending a hearbeat!");
PrintWriter printWriter=null;
try {
printWriter = new PrintWriter(clientSocket.getOutputStream());
} catch (IOException e) {
logger.info(e.toString());
}
if(printWriter!=null){
printWriter.print("HEARTBEAT#");
printWriter.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个线程,"处理器"做了类似的事情:
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
Run Code Online (Sandbox Code Playgroud)
通过这种方式,每次我希望发送心跳时,我都会创建一个新的"缓冲区",而且我的消息永远不会被覆盖.
不幸的是,情况似乎并非如此.我收到一条消息来自管道:dsgdsbHEARTBEAT #sdg
这会导致稍后的核心转储.
这是我的问题:
1)套接字显然不是线程安全的,但是我从它们获得的PrintWriters是否安全?或者它只是返回相同的PrintWriter?
2)什么类似于Java中的套接字缓冲区?我该如何看待这个问题?
3)如何使这些线程不写入套接字上的相同缓冲区?
嘿帮派.我刚刚使用sys/socket在C++中编写了一个客户端和服务器.我需要处理客户端仍处于活动状态但服务器已关闭的情况.建议的方法之一是使用心跳来定期断言连接.如果没有尝试在Y时间段内每隔X秒重新连接一次,那么就超时了.
这种"心跳"是检查连接的最佳方式吗?
我正在使用的套接字可能有关于它的信息,有没有办法检查是否存在连接而没有弄乱缓冲区?
我正在运行两个大型日志文件,我想比较时间戳.
我已经编写了一个Perl脚本来查找匹配的日志语句,但我需要找到时间戳的差异.
例如,15:31:19.430888减去15:31:19.427763
在Perl中处理时间有什么好的结构吗?如果我能避免的话,我不想自己处理时间数学.
假设我有一个我正在构建的二进制文件,并且我包含了一堆从未实际使用过的文件,并且后续链接到这些包含文件所描述的库?(再次,这些库从未使用过)
除了增加编译时间之外,这有什么负面影响?
我们有一个具有高性能需求的消息处理系统.最近我们注意到第一条消息比后续消息长了许多倍.当这通过我们的系统时,发生了一堆转换和消息扩充,其中大部分是通过外部库完成的.
我只是简要介绍了这个问题(使用callgrind),将一条消息的"运行"与许多消息的"运行"进行比较(提供比较基线).
我看到的主要区别是函数"do_lookup_x"占用了大量的时间.查看对此函数的各种调用,它们似乎都由公共函数调用:_dl_runtime_resolve.不知道这个函数做了什么,但对我来说这看起来像是第一次使用各种共享库,然后由ld加载到内存中.
这是正确的假设吗?二进制文件在准备好使用之前不会将共享库加载到内存中,因此我们会看到第一条消息大幅减速,但后续没有?
我们如何避免这种情况?
注意:我们以微秒级操作.
我在新分配的项目中发现了一堆脚本,即"关闭"脚本.他们只是做一些基本搜索并运行Unix kill命令.他们有什么理由不应该这样关闭这个过程吗?这是否确保动态分配的内存将正确返回?还有其他负面影响吗?我在直觉下操作,这是终止进程的最后手段.
所以.我有一个问题,我在一台机器上有两个版本的GCC.
3.4.6和4.1
这是由于新软件的一些依赖性问题.(需要glibc 4.1)
当我将这个新软件与4.1库链接时,它链接得很好.但是,当涉及到执行软件时,它无法找到库,因为它在我的LD_LIBRARY_PATH中查看3.4.6.如果我将LD_LIBRARY_PATH设置为4.1 lib,它会破坏shell,同时杀死其他东西,因为3.4.6库用于此目的.
它有点像22.
有没有办法在链接时我可以在不使用LD_LIBRARY_PATH的情况下给出该共享库的绝对路径?
这样我希望有两个版本,但只使用4.1这个特定的应用程序?
这是一个跟进:
基本上,我有一个服务器循环来管理与一个单独客户端的连接.在循环中的某一点,如果ClientSocket存在,它会尝试读取以检查客户端是否仍然连接:
if (bufferedReader.read()==-1 ) {
logger.info("CONNECTION TERMINATED!");
clientSocket.close();
setUpSocket(); //sets up the server to reconnect to the client
}else{
sendHeartBeat(); //Send a heartbeat to the client
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦创建了套接字,应用程序将挂起读取,我假设等待永远不会发生的数据,因为客户端永远不会发送到服务器.在此之前没问题,因为正确处理断开连接(当客户端断开连接时读取最终会失败)并且循环将尝试重新建立连接.但是,我现在已经添加了上面的sendHeartBeat()方法,它定期让客户端知道服务器仍在运行.如果读取持有线程,则心跳永远不会发生!
所以,我假设我正在测试连接是否仍然不正确.我可以,作为一个快速的黑客,在一个单独的线程中运行bufferedReader.read(),但随后我将有各种各样的并发问题,我真的不想处理.
所以问题有几个:1)我是否正确检查客户端断开连接?2)如果没有,我该怎么办?3)如果我正确地这样做我怎么做我读取不让流程人质?或者是穿线唯一的方式?
我们有一个消息处理系统,其中低延迟是至关重要的.最近,我发现虽然我们通过我们的系统保持高利率,但我们看到一些"异常值".(消息比它们需要的时间长得多)当我们删除日志记录时,我们的系统不会显示这些异常值.
现在我们的日志记录基本上只是一个包装的ostream,其中一些日志级功能类似于log4j(调试,致命,调试等).
我想知道,其他人如何管理日志记录性能,特别是在消息处理活动中?您如何管理这些I/O绑定活动?你把它条纹化了吗?你转移到数据库了吗?
任何优化日志记录的建议都值得赞赏
注意:我认识到我们的系统可能存在导致异常值的其他问题,但是为了这个问题,我只对记录优化感兴趣,谢谢.
另外:我们的系统必须进行日志记录.
我有一个路径作为shell脚本中的字符串,可以是绝对的或相对的:
/usr/userName/config.cfg
要么
../config.cfg
我想提取文件名(在最后一个之后的部分,所以在这种情况下:"config.cfg")
我认为最好的方法是使用一些简单的正则表达式?它是否正确?我应该或应该使用sed还是awk?
Shell脚本的字符串操作功能本身看起来非常具有初衷性,并且显得非常深奥.
任何示例解决方案也受到赞赏.