Tag: tcp

C编程TCP校验和

我几天来一直无法为TCP做校验和。 我在互联网上查看了很多来源,但我见过的所有例子都没有向您展示如何进行TCP校验和。 我也查看了RFC文档但仍遇到问题: 下面是我用来生成校验和的代码: unsigned short checksum(unsigned short * buffer, int bytes) { unsigned long sum = 0; unsigned short answer = 0; int i = bytes; while(i>0) { sum+=*buffer; buffer+=1; i-=2; } sum = (sum >> 16) + (sum & htonl(0x0000ffff)); sum += (sum >> 16); return ~sum; } 此function适用于IP校验和。 下面是我为TCP标头制作的结构: struct tcp_header { […]

可以通过TCP进行广播吗?

我正在用C编写服务器/客户端系统,它在TCP连接下使用BSD套接字。 服务器是multithreading的,每个连接都在自己的接收器中运行。 每个客户端都能很好地与服务器进行一对一的交谈,遗憾的是我无法想到实现SendToAll()函数的方法,例如,如果客户端A做了需要发送数据包的事情。所有的客户。 我该怎么办? 我正在考虑在每个接收器中实现队列,并且任何广播都被发送到这些队列; 当接收器发出一个新数据包时,它会将该消息添加到数据包中,如果这有意义的话。 但是,有没有办法通过TCP广播,就像你可以通过UDP?

对send()的多次调用合并为一次调用recv()

我有一个客户端 – 服务器应用程序。 客户端使用两个不同的send()调用发送一个字符串,后跟一个整数。 这两个数据应该存储在服务器上的两个不同变量中。 问题是发送的两个变量都是在recv()调用时收到的。 因此,由两个不同的send() s send()的两个字符串被链接并存储在第一个recv()的缓冲区中。 server.c: printf(“Incoming connection from client %s:%i accepted\n”,inet_ntoa(clientSocketAddress.sin_addr),ntohs(clientSocketAddress.sin_port)); memset(buffer,0,sizeof(buffer)); int sizeofMessage; if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0)==sizeofMessage)<0) { printf("recv failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } char* Name=buffer; printf("Name: %s\n",Name); if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0))<0) { printf("bind failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } int integer=ntohs(atoi(buffer)); printf("integer: %i\n",intero); client.c: if (send(clientSocket,Name,strlen(Name),0)!=strlen(Name)) { printf(“send failed”); closesocket(clientSocket); clearWinsock(); […]

TCP连接打开后是否会移动到另一个端口?

如果TCP套接字服务器在端口28081上侦听传入连接,然后接受连接并开始接收数据。 数据进入的端口是28081还是端口被更改。 例如,下面的伪代码中传入数据的端口是什么? 它仍然是28081还是操作系统分配了一个新端口?: bind listen (on port 28081) while 1 fd = accept fork if child process incoming data

使用C TCP套接字,可以’发送’返回零吗?

使用TCP套接字时,C sendfunction是否有可能返回零? 手册页只是说它将返回发送的字节数,但我不确定它是否只会在无法发送任何数据时返回-1。

打印TCP数据包数据

在TCP通信中,当数据包从以太网传输到网络(IP)层时,我想打印该数据包中的数据? 我正在研究linux。 我得到了一些信息,可以借助linux内核代码,即在linux NAT防火墙代码中完成。 但是我会在哪里获得内核源代码? 这些编码在哪里?

在C中通过TCP(SOCK_STREAM)套接字传递结构

我有一个小型客户端服务器应用程序,我希望通过C而不是C ++中的TCP套接字发送整个结构。 假设结构如下: struct something{ int a; char b[64]; float c; } 我发现很多post说我需要使用pragma pack或者在发送和接收之前序列化数据。 我的问题是,使用JUST pragma pack还是仅仅序列化是否足够? 或者我需要同时使用两者吗? 此外,由于序列化是处理器密集型过程,这会使您的性能急剧下降,因此在没有使用外部库的情况下序列化结构的最佳方法是什么(我想要一个示例代码/算法)?

无法分配请求的地址 – 可能的原因?

我有一个由主服务器和分布式从服务器组成的程序。 从属服务器向服务器发送状态更新,如果服务器在固定时间内没有从特定从属设备收到消息,则它将从属设备标记为关闭。 这种情况一直在发生。 通过检查日志,我发现从服务器只能向服务器发送一个状态更新,然后永远不能发送另一个更新,总是无法调用connect()“无法分配请求的地址(99)。 奇怪的是,从服务器能够向服务器发送多个其他更新,并且所有连接都发生在同一端口上。 似乎这种失败的最常见原因是连接处于打开状态,但我无法找到任何未解决的问题。 还有其他可能的解释吗? 为了澄清,这是我如何连接: struct sockaddr *sa; // parameter size_t sa_size; //parameter int i = 1; int stream; stream = socket(AF_INET,SOCK_STREAM,0); setsockopt(stream,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i)); bindresvport(stream,NULL); connect(stream,sa,sa_size); 此代码用于获取与另一个服务器的连接,并且这4个调用中的任何一个失败都会导致该函数失败。

close()没有正确关闭套接字

我有一个multithreading服务器(线程池),使用20个线程处理大量请求(一个节点最多500 /秒)。 有一个侦听器线程接受传入连接并将它们排队以供处理程序线程处理。 一旦响应准备就绪,线程就会写出到客户端并关闭套接字。 直到最近,一切似乎都很好,一个测试客户端程序在阅读响应后开始随机挂起。 经过大量挖掘后,似乎服务器的close()实际上并没有断开套接字。 我已经使用文件描述符编号为代码添加了一些调试打印,我得到了这种类型的输出。 Processing request for 21 Writing to 21 Closing 21 close()的返回值为0,否则将打印另一个调试语句。 使用挂起的客户端输出此输出后,lsof将显示已建立的连接。 SERVER 8160 root 21u IPv4 32754237 TCP localhost:9980-> localhost:47530(ESTABLISHED) 客户端17747 root 12u IPv4 32754228 TCP localhost:47530-> localhost:9980(ESTABLISHED) 就像服务器永远不会将关闭序列发送到客户端一样,这种状态会一直挂起,直到客户端被终止,让服务器端处于关闭等待状态 SERVER 8160 root 21u IPv4 32754237 TCP localhost:9980-> localhost:47530(CLOSE_WAIT) 此外,如果客户端指定了超时,它将超时而不是挂起。 我也可以手动运行 call close(21) 在gdb的服务器中,客户端将断开连接。 这可能在50,000个请求中发生一次,但可能不会在较长时间内发生。 Linux版本:2.6.21.7-2.fc8xen Centos版本:5.4(最终版) 套接字动作如下 服务器: […]

在C / C ++中从TCP套接字读取的正确方法是什么?

这是我的代码: // Not all headers are relevant to the code snippet. #include #include #include #include #include #include #include #include char *buffer; stringstream readStream; bool readData = true; while (readData) { cout << "Receiving chunk… "; // Read a bit at a time, eventually "end" string will be received. bzero(buffer, BUFFER_SIZE); int readResult = read(socketFileDescriptor, buffer, […]