Tag: tcp

了解TCP校验和function

我相信TCP校验和function执行以下操作: 将伪头和TCP段头和数据分解为2个字节块。 如果长度不是2个字节,则在最后一个块的末尾添加一个0字节的填充,以使其为2个字节。 获取总和的一个补码以获得TCP校验和。 听起来很简单。 因此我编写了自己的通用checksum函数: #include #include uint16_t checksum(uint16_t * data, int size) { uint16_t sum = 0; int i = 0, length = size / 2; while (i < length) sum += data[i++]; if (size % 2) sum += data[i] & 0xFF00; return htons(~sum); } 然而,其他人写的checksumfunction似乎更复杂。 例如: uint16_t checksum(uint16_t * addr, int len) […]

libpcap – packet ip header length是带有loopback tcp请求的零字节

我试图使用libpcap查看TCP有效负载信息。 为此,我需要在内存中找到有效负载的位置。 我正在使用此Programming With Pcap指南来确定请求有效负载的位置。 嗅探源自与服务(环回适配器)位于同一台机器上的客户端的数据包时,IP标头长度为0.我无法成功找到请求有效负载的位置。 听循环适配器时会出现这种情况吗? 我正在使用MacOSx 10.8系统监听适配器’lo0’。 这是我正在尝试的: //this callback is called when a packet is found void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet){ ethernet = (struct sniff_ethernet*)(packet); ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); <– the result is 0 size_ip = IP_HL(ip)*4; if (size_ip < 20) { printf(" * Invalid […]

如何在读取完成之前远程服务器关闭套接字时如何处理C中的套接字读取?

读取调用上的客户端块等待读取n个字节。 服务器写入n个字节并立即关闭连接。 如果在读取完成之前套接字关闭或由于某些其他问题,在这种情况下可以读取调用返回负数或零吗? (在这种情况下,客户端/服务器在同一个Linux机器上运行) 我正面临这样的情况,但不确定这在TCP / IP子系统中如何工作以及如何解决它。 Sever: write close Client: read close

通信ac服务器和java客户端时出错

我正在尝试在C中创建一个带有multithreading支持的tcp echo服务器和用java编写的客户端,两者都使用套接字进行通信。 通信开始很好,但不知何故,在服务器和客户端之间传递的字符串经过几次尝试(添加新的行字符或发送的旧消息片段)后开始“损坏”。 我搜索了论坛,并认为问题是C的空字符,但在java中删除它没有任何区别。 这是C服务器的代码: #include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #include #include #include struct message { int operacion; int dato; }; int max_attempts; int obtenerMaxAttempts() { FILE *fp; fp = fopen(“server.conf”, “r”); if (fp == NULL) { perror(“Error abriendo fichero”); printf(“Errno:%d”, errno); } char line[LINE_MAX]; […]

在套接字上发送一个结构,在C中使用正确的填充和字节序

我有几个结构定义为通过不同的操作系统(tcp网络)发送。 定义的结构是: struct Struct1 { uint32_t num; char str[10]; char str2[10];} struct Struct2 { uint16_t num; char str[10];} typedef Struct1 a; typedef Struct2 b; 数据存储在文本文件中。 数据格式如下: 123 馅饼 脆皮 Struct1a存储为3个单独的参数。 但是,struct2是两个独立的参数,第二行和第三行都存储在char str []中。 问题是当我通过多个网络写入服务器时,数据未正确接收。 有许多空间可以分隔结构中的不同参数。 当我写入服务器时,如何确保正确的发送和填充? 如何正确存储数据(动态缓冲区或固定缓冲区)? write的例子:write(fd,&a,sizeof(typedef struct a)); 它是否正确? 问题接收struct2的侧输出: 123(,) 0(,馅饼) 0(地壳) 正确的输出 123(馅饼,地壳)

使用TCP时发送1个大块或大块小块是否更好?

在我accept()连接,然后write()到客户端套接字之后,最好是一次写入要发送的所有数据还是以块的forms发送它? 例如: 接受,写1MB,断开连接 …要么… 接受,写入256个字节,写入256个字节,… n,断开连接 我的直觉告诉我底层协议会自动执行此操作,并进行错误更正等。这是正确的,还是我应该将数据分块? 在你问之前,不,我不确定我在哪里想到数据的大块 – 我认为这是我从编程C#web服务中获得的本能(为了克服接收缓冲区限制等等,我认为)。 坏习惯? 注意 :我正在使用C.

如何在继续之前明确等待TCP ACK?

有没有办法让send()等待所有已发送的数据已被确认(如果已达到ACK的超时,则返回-1),或者是否有其他机制等待在send()之后但在做其他事情之前确认? 我使用的是标准的Unix Berkeley套接字API。 我知道我可以实现一个应用层ACK,但是当TCP的ACK很好地完成目的时,我宁愿不这样做。

简单的跨平台TCP IP API?

我不打算使用QT或wxWidgets的API之类的东西。 我只想要能在Android,iOS,Windows,Mac,Linux上运行的简单套接字。 我正在制作一个事件驱动的纸牌游戏,所以TCP最好。 基本上,我只想连接和validation客户端。 之后我只需要能够发送消息。 我打算使用可靠的UDP,但TCP似乎更合适。 如果有人也有类似tcp聊天应用程序的基本教程,我会很感激。 谢谢 我只是想能够使用,发送(),recv等,而不用担心WINSOCK或POSIX,

通过TCP发送结构(C编程)

我有一个客户端和服务器程序,我想从客户端发送整个结构,然后在服务器上输出结构成员“ID”。 我已完成所有连接等,并已设法通过以下方式发送字符串: send(socket, string, string_size, 0); 那么,是否可以通过send()发送结构而不是字符串? 我可以将服务器上的缓冲区替换为相同类型的空结构吗?

如何在unsigned char中更改4位?

unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char)); unsigned char *single_char = adata+100; 如何更改single_char中的前四位以表示介于1..10(int)之间的值? 问题来自TCP头结构: Data Offset: 4 bits The number of 32 bit words in the TCP Header. This indicates where the data begins. The TCP header (even one including options) is an integral number of 32 bits long. 通常它的值为4..5,char值类似于0xA0。