Articles of socket

为什么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; […]

HTTP持久连接

尝试使用Linux套接字接口在C中实现一个简单的HTTP服务器我遇到了一些特定的function,我希望它有一些困难,即持久连接。 使用单独的TCP连接一次发送一个文件相对比较容易,但似乎并不是非常有效的解决scheme(考虑多个握手)。 无论如何,服务器应该在一个TCP连接期间处理多个请求(HTML,CSS,图像)。 你能否给我一些线索如何解决这个问题?

在Linux中select并接受延迟

我创build了一个简单的应用程序来接受使用select()和accept()的IPv4 TCP连接。 我使用python脚本来testing这个。 它依次打开100个连接。 即: for i in range(100): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print s.connect((IP, PORT)) s.send("Test\r\n") 我观察到的是,在第一次X连接后,我的应用程序在select()中停留了2秒钟。 strace的输出: 1344391414.452208 select(30, [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29], NULL, NULL, NULL) = 1 (in [3]) […]

普通文件上的Epoll

epoll (在Linux上)对普通文件有用吗? 我知道它主要用于套接字,但只是想知道。

边缘触发事件的epoll

epoll的手册页: http://linux.die.net/man/7/epoll 有一个边缘触发的示例代码,如下所示: for (;;) { nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_pwait"); exit(EXIT_FAILURE); } for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &local, &addrlen); if (conn_sock == -1) { perror("accept"); exit(EXIT_FAILURE); } setnonblocking(conn_sock); ev.events = EPOLLIN | […]

聊天室在Linux中的C / Socket编程

我有一个简单的服务器和客户端C代码来为multithreading使用线程(pthread库)做一个聊天室。 我一直在遇到的问题是,我不能想办法让服务器写客户端通过套接字发送到所有其他客户端的每条消息。 我在这里读过其他类似的post,很无奈。 请帮助我,我需要为学校做这个。 我会马上发送这两个代码。 Server.c: #include<stdio.h> #include<string.h> //strlen #include<stdlib.h> //strlen #include<sys/socket.h> #include<arpa/inet.h> //inet_addr #include<unistd.h> //write #include<pthread.h> //for threading , link with lpthread void *connection_handler(void *); int main(int argc , char *argv[]) { int socket_desc , new_socket , c , *new_sock; struct sockaddr_in server , client; char *message; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM […]

Linux,套接字,非阻塞连接

我想创build一个非阻塞连接。 喜欢这个: socket.connect(); // returns immediately 为此,我使用另一个线程,一个无限循环和Linux epoll。 像这样(伪代码): // in another thread { create_non_block_socket(); connect(); epoll_create(); epoll_ctl(); // subscribe socket to all events while (true) { epoll_wait(); // wait a small time(~100 ms) check_socket(); // check on EPOLLOUT event } } 如果我运行一个服务器,然后运行一个客户端,所有的工作。 如果我第一次运行一个客户端,等待一段时间,运行一个服务器,然后客户端不连接。 我究竟做错了什么? 也许它可以做不同?

erlang:UNIX域套接字支持?

有没有办法直接从Erlang访问UNIX域套接字(例如/ var / run / dbus / system_bus_socket), 而不诉诸第三方驱动程序?

阻止recv()返回小于请求的字节的情况

recv()库函数手册页提到: 它返回收到的字节数。 它通常返回任何可用的数据,直到请求的金额,而不是等待收到所需的全部金额。 如果我们使用阻塞recv()调用并请求100字节: recv(sockDesc, buffer, size, 0); /* Where size is 100. */ 并且只有50个字节被服务器发送,那么这个recv()被阻塞,直到有100个字节可用,否则它将返回接收50个字节。 情况可能是这样的: 服务器发送仅50个字节后崩溃 错误的协议devise,其中服务器只发送50字节,而客户端期待100,服务器也在等待客户端的回复(即套接字closures连接尚未由服务器启动recv将返回) 我对Linux / Solaris平台感兴趣。 我没有开发环境来自己检查一下。

当一个非阻塞send()只传输部分数据时,我们可以假设它会在下次调用时返回EWOULDBLOCK吗?

有两种情况在非阻塞套接字的手册页中有详细logging: 如果send()返回与传输缓冲区相同的长度, 则整个传输成功完成,并且套接字可能处于或不处于返回EAGAIN / EWOULDBLOCK状态,下一个调用> 0字节的请求将被传输。 如果send()返回-1,而errno是EAGAIN / EWOULDBLOCK,则没有任何传输完成,程序需要等待套接字准备好更多的数据(epoll情况下的EPOLLOUT)。 没有logging的非阻塞套接字是: 如果send()返回小于缓冲区大小的正值。 假设send()会在甚至多一个字节的数据上返回EAGAIN / EWOULDBLOCK是否安全? 还是应该一个非阻塞的程序试图发送()一个更多的时间来得到一个决定性的EAGAIN / EWOULDBLOCK? 如果实际上并没有处于“阻塞”状态来响应它,我担心将EPOLLOUT监视器放在套接字上。 很显然,后一种策略(试图再次得出结论)具有明确定义的行为,但是更为冗长,并且对性能造成了冲击。