Tag: network programming

在TCP标头中操作ISN号码的最有效方法

我目前正在尝试编写一个能够创建稳定的TCP连接并完全控制ISN号码的程序。 我一直用C语写作,我的知识非常有限,我已经知道是否有更好的方法。 我尝试的是手动构建标头,使用原始套接字发送和接收数据包而不会干扰内核,这是一个挑战。 因此,无论语言如何,您认为操作ISN的最有效和最简单的方法是什么?

什么是在C中转换字符串顺序的可移植方式

我正在尝试编写可与任何可以建立套接字连接的标准客户端进行通信的服务器(例如telnet客户端) 它最初是一个echo服务器,当然不需要担心网络字节排序。 我熟悉ntohs,ntohl,htons,htonl函数。 如果我转移16位或32位整数,或者如果发送的字符串中的字符是2或4字节的倍数,那么它们本身就会很好。 我想创建一个对字符串进行操作的函数,例如: str_ntoh(char* net_str, char* host_str, int len) { uint32_t* netp, hostp; netp = (uint32_t*)&net_str; for(i=0; i < len/4; i++){ hostp[i] = ntoh(netp[i]); } } 或类似的东西。 上面的假设是单词大小为32位。 我们不能确定发送机器上的字数不是16位还是64位正确? 对于客户端程序,例如telnet,他们必须在发送之前使用hton *,在接收数据之后使用ntoh *,对吗? 编辑:对于那些人而言,因为1-char是一个字节,字节序无关紧要: int main(void) { uint32_t a = 0x01020304; char* c = (char*)&a; printf(“%x %x %x %x\n”, c[0], c[1], c[2], c[3]); } […]

为什么struct hostent中的h_addr_list是char **而不是struct in_addr **?

我是网络编程的新手。 以下结构定义让我很困惑。 这里h_addr_list是一个定义为字符串数组,但它用于存储in_addr结构的数组。 为什么它没有定义为struct in_addr **h_addr_list而不是char **h_addr_list ? struct hostent { char *h_name; /* Official domain name of host */ char **h_aliases; /* Null-terminated array of domain names */ int h_addrtype; /* Host address type (AF_INET) */ int h_length; /* Length of an address, in bytes */ char **h_addr_list; /* Null-terminated array of in_addr structs […]

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

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

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 ++中交换双位的比特 然而,这个问题或多或少都是我搜索的:我从网络上收到一个双,我想在我的机器上正确编码。 在我收到int的情况下,我使用ntohl执行此代码: int * piData = reinterpret_cast((void*)pData); //manage endianness of incomming network data unsigned long ulValue = ntohl(*piData); int iValue = static_cast(ulValue); 但是在我得到double的情况下,我不知道该怎么做。 该问题的答案建议: template void swap_endian(T& pX) { char& raw = reinterpret_cast(pX); std::reverse(&raw, &raw + sizeof(T)); } 但是,如果我引用此网站 : The ntohl() function converts the unsigned integer netlong from network byte order […]