Articles of tcp

确定客户端绑定的TCP端口号

我创build了一个TCP套接字,而不打扰绑定到[socket.sin_port = 0]的端口号。 不过后来如果我想打印客户端的端口号,我该怎么做呢? 客户端C应用程序(在Linux上)创build了许多连接到服务器的客户端。 为了debugging问题,我捕捉飘渺的stream量。 我想在问题出现时打印日志中的端口号,以便轻松过滤。 任何帮助,将不胜感激。 -Prabhu

为什么STRACE显示EAGAIN(资源暂时不可用)

以下是我得到的序列 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 7 setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0 setsockopt(7, SOL_SOCKET, SO_SNDBUF, [32120], 4) = 0 getsockopt(7, SOL_SOCKET, SO_SNDBUF, [30064835312], [4]) = 0 setsockopt(7, SOL_SOCKET, SO_SNDBUF, [64240], 4) = 0 getsockopt(7, SOL_SOCKET, SO_SNDBUF, [30064899552], [4]) = 0 stat("/etc/localtime", {st_dev=makedev(8, 1), st_ino=229001, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=265, st_atime=2013/07/15-06:30:03, st_mtime=2012/06/25-23:46:43, st_ctime=2012/06/25-23:46:43}) […]

在testserver上,使用Select()连接的Linux TCP失败

我的问题是:我在Linux中编程接口来通过以太网控制GPIB控制器。 要做到这一点,我打开一个TCP套接字,只是发送命令到控制器。 到目前为止,这工作得很好。 我在为Interface写某种unit testing的时候出现了这个问题:为了检查我在一个单独的线程中使用了一个来自boost lib的tcp接受器,并且连接到它而不是实际的控制器。 这也正在工作,但是只要来自接口的connect()调用被阻塞。 但是,因为我需要connect()调用指定的超时,我必须连接到select()函数: // Open TCP Socket m_Socket = socket(PF_INET,SOCK_STREAM,0); if( m_Socket < 0 ) { m_connectionStatus = STATUS_CLOSED; return ERR_NET_SOCKET; } struct sockaddr_in addr; inet_aton(m_Host.c_str(), &addr.sin_addr); addr.sin_port = htons(m_Port); addr.sin_family = PF_INET; // Set timeout values for socket struct timeval timeouts; timeouts.tv_sec = SOCKET_TIMEOUT_SEC ; // const -> 5 […]

如何检测tcp客户端连接到服务器在c + +

我有一个TCP客户端/服务器,我想检测客户端的连接丢失; 因为我的客户端有多个接口,我一次连接到服务器与其中之一,我想知道如何检测客户端的连接丢失,以便我可以连接我的tcp客户端与另一个接口到服务器,如果他们全部我把我的数据存储在文本文件中。 我GOOGLE了,我已经看到保持活着,但不是我想要的。 如果这是重要的我的项目是在Linux和代码是在C + +。

Linux:如何将整个数据包发送到另一台主机上的特定端口?

我已经使用libpcap捕获了一个TCP数据包,并且我想把这个整个数据包(不用修改它)发送到另一个主机上的另一个端口上的另一个嗅探器。 有什么办法可以做到这一点? 非常感谢!

在单独的TCP段中发送数据,而不被TCP堆栈合并

在Linux上(内核3.0.0.12; C ++与GCC 4.6.1)我想通过(POSIX)send-call发送几个TCP数据包。 使用Wireshark,我可以看到数据包不是在单独的TCP帧中发送的,而是两个或更多的数据包在一起发送。 有没有办法告诉系统从一个send()缓冲区发送数据到自己的TCP数据包中? 程序stream不应该阻塞在发送呼叫。

为什么getsockopt()不会返回TCP_MAXSEG的期望值?

我试图以编程方式configuration我的TCP连接的MSS在GNU / Linux系统,特别是Ubuntu 12.04,内核3.2.0-68-generic 根据男子7 tcp TCP_MAXSEG传出TCP数据包的最大段大小。 如果在连接build立之前设置了这个选项,它也会改变在初始数据包中通告给另一端的MSS值。大于(最终的)接口MTU的值不起作用。 技术合作计划还将对所提供的价值施加最小和最大限度的限制。 这让我想我可以在连接TCP套接字之前configuration该值。 我写了一小段代码来创build套接字,我使用setsockopt()来configurationMSS。 在我的testing中,我将这个mss设置为1000B。 代码调用setsockopt()后跟getsockopt()来仔细检查已正确configuration的值。 两个系统调用都返回0(没有错误)。 之后,我连接到远程主机通过tcpdumpvalidation使用的MSS是正确的。 在这里我看到: getsockopt()返回的MSS值始终为536字节 tcpdump显示syn包中configuration的MSS 修改我的代码以在连接套接字后configurationMSS。 getsockopt()返回的MSS值是1448 Bye 有没有解释这种行为的正确方法? 几个注意事项: 根据维基百科536 B = MaxIPDatagramSize – IPHeaderSize – TcpHeaderSize这是为了避免IP数据包碎片。 创build一个套接字并连接它(没有setsockopt()调用),显示由getsockopt()返回的536 B的mss,但tcpdump在SYN数据包中显示一个1460 B的公告,这是有道理的1500 – IpHeader – TcpHeader 下面,如果你有兴趣,是我的代码: int setSocketMss( int i_sd, int i_mss ) { int res = 0; int mss = i_mss; […]

发送固定长度的TCP帧

我需要使用TCP在固定的非标准MTU(例如1560)的子网上发送一些数据。 如果帧的长度小于MTU,则通过该子网传输的所有以太网帧都应手动填充0。 所以,数据大小应该是(1560 – sizeof(IP头) – sizeof(TCP头))。 这是我要这样做的方式: 我设置了TCP_CORK选项来减less数据的分段。 这是不可靠的,因为有200毫秒的天花板,但它的工作原理。 我知道IP头的大小(20字节),所以数据长度应该等于(1540 – sizeof(TCP头))。 那就是问题所在。 我不知道TCP头的大小。 它的“选项”字段的大小是浮动的。 所以,问题是:如何获得TCP头的大小? 或者也许有一些方法发送TCP帧与固定长度的头?

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()开始,但很快就失去了我的方式。

可以在Unix域套接字上使用SO_REUSEPORT吗?

Linux内核> = 3.9允许在内核负载平衡的进程之间通过设置SO_REUSEPORT共享套接字: http : //lwn.net/Articles/542629/ 这怎么可以用于AF_UNIXtypes的套接字? 看来,它只适用于TCP,而不是Unix域套接字。 这是一个Pythontesting程序: import os import socket if not hasattr(socket, 'SO_REUSEPORT'): socket.SO_REUSEPORT = 15 if True: # using TCP sockets # works. test with: "echo data | nc localhost 8888" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) s.bind(('', 8888)) else: # using Unix domain sockets # does NOT work. […]