我想在没有wincap库的情况下嗅探网络数据包,请给我一些提示或方向,以便我能够实现.
我们有一个Java客户端,可以保持对远程服务器的持久套接字连接.客户端每15秒轮询一次DB表,如果有新项,则将其序列化并将其写入套接字.
在写入输出流之前,我想检查套接字连接是否仍然良好.对于特定的应用程序逻辑,执行此主动检查比捕获异常和重新连接更为简单.
我使用下面的代码弄清楚当连接断开时哪种方法可以让我知道:
LOG.debug("Socket status: bound=" + _socket.isBound() + ", closed=" + _socket.isClosed() + ", connected=" + _socket.isConnected() + ", outputShutdown=" + _socket.isOutputShutdown() + ", inputShutdown=" + _socket.isOutputShutdown());
Run Code Online (Sandbox Code Playgroud)
我暂时禁用了我的网络适配器,并在下次轮询期间,正如预期的那样,写入套接字时出现异常.
但是,debug语句打印了以下内容:
"Socket status: bound=true, closed=false, connected=true, outputShutdown=false, inputShutdown=false"
Run Code Online (Sandbox Code Playgroud)
我希望关闭是真实的或连接是假的.我得到的实际价值似乎是一个谎言.
有没有办法可靠地检查套接字的连接状态?
我有一个基本的ruby程序,它侦听端口(53),接收数据然后发送到另一个位置(谷歌DNS服务器 - 8.8.8.8).响应不会回到原来的目的地,或者我没有正确转发它们.
这是代码.NB我正在使用EventMachine
require 'rubygems'
require 'eventmachine'
module DNSServer
def post_init
puts 'connected'
end
def receive_data(data)
# Forward all data
conn = UDPSocket.new
conn.connect '8.8.8.8', 53
conn.send data, 0
conn.close
p data.unpack("H*")
end
def unbind
puts 'disconnected'
end
end
EM.run do
EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end
Run Code Online (Sandbox Code Playgroud)
任何关于调试原因或提示的想法都将非常受欢迎.
我刚开始学习网络编程.我的第一个程序非常简单:一旦连接,服务器程序显示客户端程序发送的内容(字符).一切正常,直到他们连接起来.起初,我使用putc完成了发送循环:
while((c = getc(stdin)) != '\n')
putc(c, (FILE *) connection);
Run Code Online (Sandbox Code Playgroud)
并使用getc接收一个:
while((c = getc((FILE *) connection)) != '\n')
putc(c, stdout);
Run Code Online (Sandbox Code Playgroud)
连接后,我遇到了分段错误.然后我尝试使用发送:
while(1) {
memset(str, null, strlen(memset));
while(((c = getc(stdin)) != '\n') && sizeof(str) <= 100) {
strcat(str, (char *) c); // cast to char * is to make gcc happy
}
send(connection, (void *) str, sizeof(str), (int) NULL);
}
Run Code Online (Sandbox Code Playgroud)
和recv:
while((stat = recv(connection,str,100,0)) != 0) {
printf("\nReceived %d bytes of data from %s: %s", stat, client, str);
}
Run Code Online (Sandbox Code Playgroud)
现在recv()保持返回-1并且errno设置为107.这是什么意思?我哪里做错了?顺便说一下,我正在使用Linux和gcc.
非常感谢你的帮助!:) …
我正在编写一个大型的金融应用程序,我主要使用Java.现在,为了获得一些数据,我需要编写一个小脚本(<200 LOC)来下载CSV文件(超过20,000个)并将它们存储到磁盘上.我需要这个很快,但是,几分钟对我没有任何影响.我打算用Java编写它并不是很难,但是,如果我用Ruby编写它会更快,所以我想知道Ruby(或JRuby)之间的速度是否会有很大差异和Java.20,000个文件都是大约1/2兆字节,我正在下载的服务器并不热衷于泄露数据(它完全合法,不用担心),所以,我的应用程序必须随机睡觉之间,如果网站拒绝请求,它必须睡3分钟.
建议使用任何其他易于使用的Java语言.
在下一个代码中,当我尝试连接客户端时,服务器显示以下错误:
"无效论证",我看不出错误.
if((l_sock=socket(AF_INET,SOCK_STREAM,0))!=-1)
{
struct sockaddr_in srv_dir;
srv_dir.sin_family=AF_INET;
srv_dir.sin_port=8500;
srv_dir.sin_addr.s_addr=INADDR_ANY;
if((bind(l_sock,(struct sockaddr *)&srv_dir,sizeof(struct sockaddr_in)))!=-1)
{
if(!(listen(l_sock,5)))
{
signal(SIGINT,cerraje);
int t_sock;
struct sockaddr_in cli_dir;
socklen_t tam;
time_t tstmp;
struct tm * res;
res=(struct tm *)malloc(sizeof(struct tm));
while(!key)
{
if((t_sock=accept(l_sock,(struct sockaddr *)&cli_dir,&tam))!=-1)
{
tstmp=time(&tstmp);
res=gmtime(&tstmp);
send(t_sock,res,sizeof(struct tm),0);
wr_hora(*res,cli_dir.sin_addr);
}
else
perror("Petición no atendida");//The error is printed here.
Run Code Online (Sandbox Code Playgroud) 如何在java中获取此代码(tcp)到udp?谢谢.
ServerSocket servsock2 = new ServerSocket(13367);
Socket sock = servsock2.accept();
System.out.println("Client connected.");
OutputStream os = sock2.getOutputStream();
while(true){
os.write(int_value);
}
Run Code Online (Sandbox Code Playgroud) 我用这个例子 进行性能测试
有人说netty的表现如此之快.它可以处理1,00,000+并发请求/秒(请查看以下链接)
http://www.jboss.org/netty/performance/20090303-mheath.html
http://www.jboss.org/netty/performance/20090607-asalihefendic.html
但是当我尝试这个例子时,它只给我107个req/sec,同时有1000个请求
ab -n 10000 -c 1000 http://localhost:8080/
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 230 bytes
Concurrency Level: 1000
Time taken for tests: 92.784 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2900000 bytes
HTML transferred: 2300000 bytes
Requests per second: 107.78 [#/sec] (mean)
Time per request: 9278.431 [ms] (mean)
Time per request: 9.278 [ms] (mean, across all concurrent requests)
Transfer rate: 30.52 [Kbytes/sec] …Run Code Online (Sandbox Code Playgroud) 我从Andy Tanenbaum的书中得到了这段代码.我正在尝试运行它.它编译并等待连接.但是当我打字时localhost:886,我发现浏览器或终端都没有效果.(它应该根据代码回显一个新的连接字符串).
#define SERVER_PORT 886 /* The port at which the server listens */
#define BUF_SIZE 64032 /* The size of buffer for request and response */
#define QUEUE_SIZE 10 /* Block transfer size */
int main (int argc, char* argv[]) {
int sock = 0, bnd = 0, lst = 0, fd = 0, sa = 0, bytes = 0, on = 1, conn_count = 0;
char buf[BUF_SIZE];
struct sockaddr_in channel; /* IP address holder */
/* …Run Code Online (Sandbox Code Playgroud) 我想要做的基本上是通过套接字捕获浏览器的HTTP GET请求并将该请求发送到Internet,然后捕获回复并将其发送回浏览器.当转移仅由文本组成时,每件事都完美无缺.但下载图像时.浏览器给出错误"无法显示图像,因为它包含错误".任何帮助将不胜感激.
#include "cc352.h"
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
int listenfd, connfd,weblin,webcon,webwrite,n,x,y,w,w1;
socklen_t len,wlen;
struct sockaddr_in servaddr, cliaddr , webservad , webcliad;
unsigned char buff[3072] , buff2[3072] ,ext[5] ,wbuff[100000];
time_t ticks;
int yes = 1;
const char *ptr;
if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
fprintf(stderr, "socket creation failed\n");
exit (1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
if (inet_pton(AF_INET,"127.0.0.1", &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s", argv[1]);
return …Run Code Online (Sandbox Code Playgroud)