Tag: 套接字

如何检测之前连接的SSL / TCP套接字上的Internet断开连接?

我有一个阻塞基于select()的SSL_read()的线程。 主线程在需要时使用SSL_write()写入。 在unit testing期间,我发现了一个问题: 客户端TCP套接字connect()到SSL上的服务器(TLS) 一段时间后,禁用互联网 在客户端TCP / SSL套接字上写一些数据 即使没有SSL_write() , SSL_write()返回正确的写入字节数,而不是0或某些错误。 这种互联网断开是任意的,既不太高也不太低。 我的期望是,每当互联网断开连接时,套接字应该生成一些有趣的事件,这是可检测的,我将停止套接字+ SSL连接。 如果我必须建立一些客户端 – 服务器手工协议,那么这是可能的。 实现此类互联网检测的最佳方式是什么? 期望具有较少CPU周期和较少客户端服务器通信的解决方案。 我确信,这不是一个非常特殊的问题,因此必须先解决。 [PS:客户端套接字在Android和iOS等移动平台上开放,但我想知道一般解决方案。]

getaddrinfo:如果指定了节点名,AI_PASSIVE会以什么方式被忽略?

引用getaddrinfo的规范: 如果指定了AI_PASSIVE标志,则返回的地址信息应适合用于绑定套接字以接受指定服务的传入连接。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为INADDR_ANY对于IPv4地址)或IN6ADDR_ANY_INIT (IPv6地址)。 这是有道理的。 如果指定AI_PASSIVE ,则可以在返回的地址上bind() / listen() / accept() 。 如果nodename为null,则返回的地址将绑定到所有网络接口,因此您可以使用任何计算机的IP地址(例如,以太网LAN IP,Wi-Fi LAN IP,环回地址等)。 摘要:在服务器上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果未指定AI_PASSIVE标志,则返回的地址信息应适合于调用connect() (用于连接模式协议)或调用connect() , sendto()或sendmsg() (用于无连接协议)。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为环回地址。 这也是有道理的。 如果未指定AI_PASSIVE ,则可以在返回的地址上connect() / sendto() / sendmsg() 。 如果nodename为null,则获取环回地址。 简介: 不要在客户端上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果nodename参数不为null,则应忽略AI_PASSIVE标志。 咦? 忽略 AI_PASSIVE标志甚至意味着什么? 从前两个引号来看,听起来AI_PASSIVE仅用于确定您是否获得适合服务器/客户端使用的地址,并且在这两种情况下,它听起来像一个null nodename只是为您提供INADDR_ANY地址(用于服务器)或环回地址(对于客户)。 忽略 AI_PASSIVE标志有什么用呢? 这最后一句话的真正含义是什么? 它如何影响前两个引号?

在Windows中的套接字上使用fprintf

我正在尝试在Windows上的套接字上使用fprintf。 许多在线示例都是UNIX示例 。 Windows的等效代码就是我在这里要问的。 最后,我想这样做: fprintf(file_handle_to_socket, “hello world\r\n”); 我不想使用WriteFile,snprintf或其他任何东西。 只是fprintf()。 或多或少显示步骤的伪代码将是有帮助的。 这是我到目前为止: unsigned short port = enter_port; int result = 0; WSADATA wsaData; result = WSAStartup(MAKEWORD(2, 2), &wsaData); struct sockaddr_in local; memset(&local, 0, sizeof(struct sockaddr_in)); local.sin_port = htons(port); local.sin_family = AF_INET; local.sin_addr.s_addr = htonl(INADDR_ANY); int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) { fprintf(stdout,”invalid […]

简单的TCP服务器无法输出到Web浏览器

我用C语言编写了一个简单的TCP客户端和服务器程序。 它在它们之间工作正常,但我有一个疑问。 如果我想从Web服务器访问TCP服务器怎么办? 我从Web服务器获得了标题,我无法write()回Web浏览器。 响应是否应该强制执行HTTP规范? 我收到以下错误 : 服务器代码: // Server side C program to demonstrate Socket programming #include #include #include #include #include #include #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket; long valread; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = “Hello from server”; […]

将指向较大结构的指针转换为指向较小结构的指针

这篇文章将以此为基础,但将更加通用。 通常我会看到指向大型结构的指针被转换为指向较小结构的指针,我认为这是有效的,因为指针只是结构中第一个字节的地址。 我还有一个问题是,当大多数方法没有指向他们期望的类型时,如何处理指针。 我将使用Socket API作为示例: sockaddr_storage比sockaddr但是指向sockaddr指针会被转换为指向sockaddr指针,然后才会传递给sockaddr这样的函数 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 因此,当指针指向比预期更大的结构时,如何处理函数。 他们说 “哦,传给我的大小( socklen_t addrlen )比我想象的要大。最好把这个指针扔回sockaddr_storage !” 然后像这样访问其成员? 或者他们做了更复杂的事情?

不寻常的选择/袜子流行为行为

我正在编写一个小程序来请求一个文件块,然后让另一个程序返回该文件的特定块。 我可以使用最多大约555000字节的文件来使用它,但是在比这更大的任何事情上,我得到了不寻常的行为。 在我的循环中,我检查进度缓冲区,它是一个整数数组,以查看我是否有一个特定的文件块。 如果我这样做,那么我不会发送对该块的请求,但如果我没有,那么我从对等方请求块。 我有一个链接列表,我移动了,列表中的每个对等方都有一个与之关联的sockfd。 所以,从某种意义上说,我“循环”了这些要求。 一旦我把它们发出去,我就会等待消息进来。我不知道这是否是最好的方法,但它似乎是最自然的。 但是,对于较大的文件,它会在select调用时挂起。 我不完全确定为什么。 如果有人能够对此有所了解,或建议采取更好的方法,我很乐意听到。 这是我的代码。 我没有包含我调用的函数的代码,但我认为在这种情况下它不是必需的(它们是Beej的sendall和recvall函数的修改版本)。 还值得一提的是,这是一个multithreading应用程序(使用pthreads),但我没有使用任何共享变量。 感谢您抽时间阅读! total = (number of chunks in the file) my_peers = (linked list of peer structs containing sockfds, etc) int i; progress_buf = (array of ints, each representing a chunk in a file, 0 means we don’t have the chunk) while (1) […]

关于使用套接字API的简单基于TCP的echo服务器

我正在学习套接字网络API。 在这个过程中,我编写了一个使用TCP的简单Echo服务器。 我编写代码的方式是,只要服务器正在运行,客户端控制台上输入的任何内容都应该回显给它。 但是,我无法做到这一点。 虽然,对于第一次输入,我得到了回声,从下次开始,我没有得到任何消息。 我知道,我们可以使用fork()为许多客户端实现它,但是我想知道阻塞客户端的原因,以及可能的方法来纠正它。 以下是客户端的代码: #include #include #include #include #include #include #include #define MAXCOUNT 1024 int main(int argc, char* argv[]) { int sfd; char msg[MAXCOUNT]; char blanmsg[MAXCOUNT]; struct sockaddr_in saddr; memset(&saddr,0,sizeof(saddr)); sfd = socket(AF_INET,SOCK_STREAM,0); saddr.sin_family = AF_INET; inet_pton(AF_INET,”127.0.0.1″,&saddr.sin_addr); saddr.sin_port = htons(5004); connect(sfd,(struct sockaddr*) &saddr, sizeof(saddr)); for(; 😉 { memset(msg,0,MAXCOUNT); memset(blanmsg,0,MAXCOUNT); fgets(msg,MAXCOUNT,stdin); send(sfd,msg,strlen(msg),0); recv(sfd,blanmsg,sizeof(blanmsg),0); […]

C中sendto函数允许的最大缓冲区长度是多少

我正在使用UDP套接字实现一个简单的网络堆栈,我希望从客户端向服务器发送大约1 MB的字符串数据。 但是,我不知道C中UDP sendto() API的长度是否有限制。如果有限制并且sendto()不会处理超出限制的打包,那么我将不得不手动将字符串拆分为较小的块然后发送它们。 缓冲区的长度是否有限制? 或者sendto() API自己处理打包。 任何见解都表示赞赏。

如何发送大小超过64 KB的UDP数据包

我无法发送大小超过64 KB的IP multicast datagrams (对于我的实验,我需要这样做)。 我正在通过10 Gigabit ethernet链路直接连接的计算机之间传输数据包(中间没有任何跳跃,由traceroute确认)。 所有计算机都安装了Ubuntu 12.04。 我通过在/etc/sysctl.conf添加以下行来更改读写缓冲区的限制: net.core.rmem_max=12582912 net.core.wmem_max=12582912 net.core.rmem_default=12582912 net.core.wmem_default=12582912 并使用sysctl -avalidation了更改(运行sysctl -p之后)。 我是否需要重新启动才能看到更改? (我正在共享机器,所以不总是可以重启)。 用于发送和接收的接口的MTU在所有计算机中都是9000字节。 我已成功发送大小约为60 KB的数据包,对于100 KB数据包,使用tcpdump捕获显示数据包甚至没有被发送并且可能被内核丢弃(我没有在tcpdump跟踪中看到它们)。 为了能够传输大数据包(最好是100 MB的大小),我还需要做些什么?

如何在C中通过udp socket发送整数数组?

我必须通过udp套接字发送一个int数组。 我是否必须将其转换为字符数组或字节序列? 什么是标准解决方案?