Tag: tcp

为什么当我使用“control-c”来关闭发送对等体上的套接字时,接收对等体上的套接字继续无限接收

我是套接字编程的新手,我知道使用“control-c”关闭套接字是一个坏习惯,但为什么接收对等体上的套接字在我使用“control-c”关闭发送过程后仍然无限接收? 在“control-c”退出进程后,不应该关闭发送对等体上的套接字吗? 谢谢!

删除打开的TCP连接而不发送RST

查看nginx:忽略一些没有正确主机头的请求让我觉得实际上不可能通过向另一端发送RST (和/或FIN )而没有OS正确终止底层TCP连接来close(2) TCP连接。 一种解决方法是使用类似tcpdrop(8)东西,但是,从OpenBSD和FreeBSD 上的usr.sbin/tcpdrop/tcpdrop.c可以看出,它是通过基于sysctl的接口实现的,并且可能有外部的可移植性问题BSD系统。 (实际上,看起来甚至基于sysctl的实现在OpenBSD和FreeBSD之间可能不同,需要一个移植层 – OpenBSD使用 tcp_ident_mapping结构(随后,它包含两个sockaddr_storage元素,加上一些其他信息),而FreeBSD , DragonFly和NetBSD直接使用两个sockaddr_storage元素的数组。)事实certificate,OpenBSD的tcpdrop似乎确实根据tcpdump(8)发送了R数据包,并且可以通过查看/sys/netinet/tcp_subr.c :: tcp_drop()来确认/sys/netinet/tcp_subr.c :: tcp_drop() ,最后调用tcp_close() (并确认 tcp_close() 在其他地方发送RST ),因此,似乎它甚至都不起作用。 如果我自己通过C建立连接,有没有办法随后丢弃它而不确认另一方,例如,没有启动RST ?

如何使用基于TCP的HTTP下载图像?

我有一些图像可以使用HTTP下载。 我得到了这些图像的URL,如何构建基于TCP的HTTP缓冲区来下载图像? 我目前的平台上没有库,这个平台唯一支持的语言是C,所以我必须为这些资源构建HTTP缓冲区。 目前我已经构建了正常的API请求,它们都是HTTP请求,每个请求都有0个或更多参数。 但是图像请求只有一个URL,例如http://some-image.jpg ,它似乎只是一个下载工作,没有API参数,没有授权,它很简单,但是如何构建TCP请求?

在TCP流中发送消息

TCP是基于流的,这意味着您发送字节而不必将它们放在“消息”中,因此接收方可能会收到一半消息或三分之二的消息。 因此,在每个消息都是固定大小的游戏中,如果我收到一部分消息,我可以将其保留在缓冲区中,直到我收到另一部分。 这有点单调乏味,但还有其他基于消息的可靠协议吗? 可能有,但是在操作系统中没有像TCP和UDP那样实现,所以我必须使用一些库,只要它易于使用就可以了。 我总是可以制作一个有点可靠的UDP协议。 你有什么建议的?

在对等端关闭的TCP套接字上写入

我有一个客户端 – 服务器应用程序,其中每一方通过TCP套接字与另一方通信。 我正确建立连接,然后在客户端在套接字上写入任何数据之前崩溃服务器。 我看到的是第一次write()尝试(客户端)成功并返回实际的写入字节数,而后面的返回(如我所料) -1 (接收SIGPIPE )和errno=EPIPE 。 为什么第一个write()即使套接字已经关闭也是成功的? 编辑有时候下面的write()也有一个正的返回值,好像一切顺利。

将端口号绑定到TCP套接字(outgoin)以发送数据包

我知道将端口号绑定到用于发送数据的 TCP套接字并不容易(因为系统通常将随机端口绑定到套接字)。 但我在一篇文章中读到,通过使用一些低级网络方法,您可以将端口号绑定到TCP套接字然后用它来发送数据? 有没有人知道如何做到这一点? 我正在使用c编程语言

solaris中sockets错误EINPROGRESS的可能原因是什么?

Solaris中的套接字错误EINPROGRESS可能原因是什么? 我们如何检查根本原因? tcp api是:connect

测试封闭的sockets

我正在尝试测试一个被对等端优雅关闭的封闭套接字,而不会产生双重发送的延迟命中以引发SIGPIPE 。 这里假设的一个假设是,在最后一次写/发送之后,套接字在关闭后会被对等体正常关闭。 像过早关闭这样的实际错误将在代码中的其他地方处理。 如果套接字仍然打开,那么将有0个或更多字节数据,我实际上并不想从套接字缓冲区中取出。 我以为我可以调用int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK); 确定套接字是否仍然连接。 如果它已连接但缓冲区中没有数据,我将使用errno == EAGAIN返回-1并返回sockfd以供重用。 如果它已被对等方优雅地关闭,我将获得ret == 0并打开一个新连接。 我已经测试了这个,它似乎工作。 但是,我怀疑在我收集数据的最后一位和同伴FIN到达时之间有一个小窗口,我可以从我的测试recv得到假阳性EAGAIN 。 这会咬我,还是有更好的方法呢?

TCP连接错误115正在进行操作原因是什么?

我的应用程序创建了一个TCP连接,这是正常的工作。 但是在一个网络服务器上有很多IP说 174.XXX 54.xxx喜欢这个 当调用TCP连接(非阻塞,超时为60秒)到IP 174.XXX总是成功。 但TCP连接到同一服务器的ip 54.xxx正在失败(大多数时候)正在进行errno 115 measn操作。 你能否解释一下errno 115的可能原因是什么? 操作系统:Linux 我的TCP连接代码如下 tcp_connect(……) { int iValOpt = 0; int iLength= 0; fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK); ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen); if (ret < 0) { if (errno == EINPROGRESS) { stTv.tv_sec = 60; stTv.tv_usec = 0; FD_ZERO(&write_fd); FD_SET(sockID,&write_fd); iLength = sizeof(int); if (0 getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength)) { return […]

C – Linux – 内核模块 – TCP标头

我正在尝试创建linux内核模块,它将检查传入的数据包。 目前,我正在提取数据包的TCP头并读取源和目标端口 – >但是我得到的值不正确。 我有钩function: unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct iphdr *ipp = (struct iphdr *)skb_network_header(skb); struct tcphdr *hdr; /* Using this to filter data from another machine */ unsigned long ok_ip = 2396891328; /* Some problem, empty […]