Articles of 套接字

如何在Haskell中指定本地绑定接口来组播套接字?

我已经尝试了Network.Multicast包,但它确实工作,但是,我找不到指定本地绑定接口(“bond0”或“bond1”等)到组播套接字的方法。 我知道在CI需要使用ioctl将债券转换为结构sockaddr_in,然后将此结构提供给IPPROTO_IP系列的setsockopt IP_MULTICAST_IF选项,但我不知道如何在Haskell中做到这一点。 有人能帮忙吗? 谢谢!

Linux – TCP连接()与ETIMEDOUT失败

对于TCP客户端connect()调用TCP服务器.. Richard Stevens编写的UNIX®networking编程书说以下内容。 如果客户端TCP没有收到其SYN段的响应,则返回ETIMEDOUT。 例如,4.4BSD在连接被调用时发送一个SYN,另外6秒钟后,另一个24秒钟后(TCPv2的828页)发送。 如果总共75秒后没有收到响应,则返回错误。 在Linux中,我想知道什么是重试机制(多less次和多远)。 问一个TCP客户端connect()调用,我得到ETIMEDOUT错误。 该套接字具有O_NONBLOCK选项,并由epoll()监视事件。 如果有人可以指向我的代码这个重试逻辑的实现,这也将有所帮助。 我尝试了从net / ipv4 / tcp_ipv4.c的tcp_v4_connect()开始,但很快就失去了我的方式。

Linux使用boost asio拒绝套接字绑定的权限

我遇到了一个绑定套接字的问题,当我以用户的身份运行该程序时,我拒绝了permision。 这行代码会产生一个错误。 _acceptor = new boost::asio::ip::tcp::acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), serverPort)); 错误是 terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 什么():绑定:权限被拒绝 但是,如果我以root身份运行它工作正常。 我试过禁用apparmor和防火墙 sudo service apparmor stop sudo ufw disable 但我仍然有这个问题。 我错过了什么可以否认permision? 我真的很想弄清楚这一点,因为我不喜欢运行我的IDE和一个未经证实的程序作为根。 我正在运行安装了所有更新的xubuntu 13.10。

如何在linux内核中添加一个新的自定义第4层协议(一个新的原始套接字)?

我想在linux(ubuntu 14.04)中添加自己定制的第4层协议–IPPROTO_MYPROTO作为可加载的内核模块。 我已经完成了所有必要的步骤来注册协议。 在这里,我分享我的代码。 当我试图从sendmsg()发送用户空间程序的消息时,我期望通过struct proto结构注册的相应的fn myproto_sendmsg()应该在内核空间中调用。 但是我正在观察的是,虽然内核空间中的myproto_sendmsg()没有被调用,但是目标机器正在接收正确的数据。 惊喜! 惊喜! 。 是默认的udp sendmsg()fn在这里踢,就像是不速之客做他的工作。 在这里,用户空间中的sendmsg()调用返回与发送一样多的字节。 因此,FN返回成功。 用户空间程序: void forwardUDP( int destination_node ,char sendString[] ) { struct msghdr msg; destination_node = destination_node % N; //destination node to which data is to be forwaded int sock, rc; struct sockaddr_in server_addr; struct iovec iov; struct hostent *host; //hostent predefined […]

Java Linux非阻塞套接字超时行为

我有一个Java非阻塞服务器,跟踪select器中的所有套接字通道。 然后我build立500个连接到服务器并定期发送数据。 服务器收到的每一条数据都被回送给客户端。 问题来了,testing工作奇妙的几个小时,然后突然逐渐所有的服务器pipe理的套接字抛出一个连接超时IOException当试图读取数据。 我研究了客户端线程是否被扼杀(而不是发送数据),但是我正在屈服于遍历所有套接字并写出数据的客户端线程。 交通似乎不断stream动,但过了一段时间,就全部消失了。 任何想法可能导致这种行为? 我正在使用Java 6的最新版本在Linux平台上运行。我的应用程序启动了两个线程,一个用于服务器,另一个用于所有客户端。 提前致谢! 额外:问题是处理Linux而不是我的代码。 当我在Windows上运行完全相同的设置(在相同的硬件上),它永远不会超时,但几个小时后,它们开始在Linux上发生。 它必须是Linux中的某种TCP设置才会导致它发生。 感谢您的build议。

OpenSSL:接受TLS连接,然后转移到另一个进程

我们有一个运行两个进程A和B的(Linux)服务器。当前,客户端build立到进程A的连接,然后把结果的套接字的文件描述符传递给进程B,允许进程B使用现有的fd /套接口进行无缝通信与客户。 然后,客户端和进程B执行TLS握手,并继续通过生成的TLS连接进行通信。 (我在这里遗漏了很多细节,但是是的,有一个很好的理由让stream程A充当中介,而不是直接连接到stream程B) 现在,由于<long complicated story involving new client applications and websockets> ,看起来我们可能必须在进程A中执行TLS握手,然后将已build立的TLS连接传输到进程B. 那可能吗? 底层套接字的文件描述符可以被复制(我们已经这样做了),至less在理论上,内部TLS状态数据也可以被复制并用于在过程B中重buildTLS连接,有效地接pipe连接。 但是OpenSSL是否暴露了这样的设施? 我发现函数d2i_SSL_SESSION似乎为OpenSSL会话对象做了类似的事情,但是对于OpenSSL来说是相当新的,我不确定这是否足够。 有会议,上下文,生物和一些其他复杂冠冕堂皇的条款涉及。 多less将不得不被序列化并转移到过程B为此工作? 而且在实践中怎么做呢? 切换对于客户端来说是100%透明的:它必须简单地对一个给定的IP /端口执行SSL握手,然后继续在所产生的套接字上通话,而不知道一个进程接受连接并执行TLS握手,然后另一个处理所有后续的通信。

Linux上的Java套接字错误(0xFF发送,-3收到)

在Java中使用WebSocket服务器时,遇到了这个奇怪的错误。 我把它缩小为两个小的java文件,一个是服务器,另一个是客户端。 客户端只需发送0x00 ,stringHello和0xFF (根据WebSocket规范)。 在我的Windows机器上,服务器打印下列内容: Listening byte: 0 72 101 108 108 111 recieved: 'Hello' 而在我的unix框相同的代码打印以下内容: Listening byte: 0 72 101 108 108 111 -3 而不是接收0xFF它得到-3,从来没有打破循环,从不打印它收到。 代码的重要部分如下所示: byte b = (byte)in.read(); System.out.println("byte: "+b); StringBuilder input = new StringBuilder(); b = (byte)in.read(); while((b & 0xFF) != 0xFF){ input.append((char)b); System.out.print(b+" "); b = (byte)in.read(); } inputLine […]

Linux TCP服务器:在接受连接之前读取客户端的IP地址

相关: C ++ Winsock API如何在接受连接之前获取连接客户端IP? 嗨,当你运行一个TCP服务器(用C编写的,使用伯克利套接字API)是否有可能在实际接受连接之前读取客户端的IP地址/端口? 据我所知,你必须先accept连接,然后直接shutdown它,如果你不想与给定的客户端通信,因为它的IP地址。 伪代码(我正在寻找peek和refuse方法): int serverfd = listen(…); for(;;) { struct sockaddr_in clientAddr; peek(serverfd, &clientAddr, sizeof(clientAddr)); if(isLegit(&clientAddr)) { int clientfd = accept(serverfd, &clientAddr, sizeof(clientAddr)); handleClient(clientfd); } else { refuse(serverfd, &clientAddr, sizeof(clientAddr)); } }

调查函数如何在c中工作?

我是新来的套接字编程,我试图找出如何民意测验的作品。 所以我做了一个小例子程序。 该程序似乎按照我所期望的方式工作,但是当我注释掉具有int dummy虚线的行时, for循环仅在假设执行十次时才运行一次迭代。 我不明白的是variables与for循环有什么关系。 程序假设在3.5秒后打印“超时”,如果有input,打印“返回打”。 #include <stdio.h> #include <poll.h> int main(int argc, char *argv[]) { int a; int b; int c; char buf[10]; int i; struct pollfd ufds[1]; ufds[0].fd = 0; ufds[0].events = POLLIN; int rv; int dummy; for(i=0; i < 10; i++) { printf("%i ", i); if((rv = poll(ufds, 2, 3500)) == […]

我怎样才能得到与TCP套接字关联的接口名称/索引?

我正在写一个TCP服务器,需要知道每个连接从哪个接口到达。 我不能使用地址/子网来推断使用哪个接口,因为可能有接口具有相同的地址/子网值。 它基于Linux,不需要代码是可移植的。 我能find的所有函数都是通过索引获取所有接口或单个接口。 我找不到任何方式来获得与接受的TCP套接字关联的接口。 有任何想法吗? 我错过了什么? 编辑:重申,在我的情况下,IP地址不是唯一的。 目标地址(服务器本身)和源地址(客户端)都不是。 是的,这是一个非常极端的IP计划。