我试图使用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 IP header length: %u bytes\n", size_ip);
return;
}
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
size_tcp = TH_OFF(tcp)*4;
if (size_tcp < 20) {
printf(" * Invalid TCP …Run Code Online (Sandbox Code Playgroud) 我有一个基于客户端服务器的c ++应用程序,它通过网络进行通信(使用boost asio),我打算将这个客户端应用程序分发给我的客户.我的问题是我不知道如何阻止来自其他应用程序的连接请求,这就是我如何确保只有我的客户端应用程序能够连接到我的服务器.我认为如果没有建立连接就没有办法做到这一点,那么验证请求来自我的客户端的最佳方法是什么?
我有20个线程,一次在单个tcp套接字上发送数据并接收数据.当我运行我的应用程序时,我没有看到任何同步问题,但根据我的理解,当两个线程同时尝试写入tcp套接字或当一个线程正在写入而其他线程正在读取时,可能会出现一些问题.
如果我的理解是正确的,为什么我不会面临任何错误?
我是一个知道相当多的C++和其他编程语言的中级爱好程序员,现在我正在尝试使用原始套接字而不是c ++中的熟插槽,但是当我查看样本和其他人的源代码时(出于学习目的,我没看到)我可以看到他们都知道如何为网络层制作标题,例如他们写了一个像这样的ip标头结构:
struct IP_HEADER
{
BYTE ver_ihl; // Version (4 bits) and Internet Header Length (4 bits)
BYTE type; // Type of Service (8 bits)
WORD length; // Total size of packet (header + data)(16 bits)
WORD packet_id; // (16 bits)
WORD flags_foff; // Flags (3 bits) and Fragment Offset (13 bits)
BYTE time_to_live; // (8 bits)
BYTE protocol; // (8 bits)
WORD hdr_chksum; // Header check sum (16 bits)
DWORD source_ip; // Source Address (32 bits)
DWORD destination_ip; // …Run Code Online (Sandbox Code Playgroud) 我是c编程的新手.作为我的网络安全单一课程的一部分,我必须设计一个SSL握手模拟.我在网上找到了一个示例代码,但是我不了解代码的某些部分.你可以帮我跟进:
怎么(char) 0办?(send_data定义为char send_data[1024];)
send_data[0] = (char) 0; //Packet Type = hello
send_data[1] = (char) 3; //Version
Run Code Online (Sandbox Code Playgroud)
编辑+关注
伙计我知道什么类型的铸件.
我理解什么是铸造但是我发布的代码什么也没做.即使整数0被转换为一个字符,它也没有做任何事情,因为当你打印它时 - 它是空白的 - 没有价值.
例如:
#include <stdio.h>
#include <stdlib.h>
int main(){
char test;
int num;
num = 1;
test = (char) num; // this does nothing
printf("num = %d , %c\n",num,num);
printf("test = %d , %c\n",test,test);
// Isn't this the correct way to do it ?? :
num = 3;
test = '3'; // now this …Run Code Online (Sandbox Code Playgroud) 我从服务器传递一个指针数组到客户端.但是在客户端,当我拒绝接收到的数组时,我会得到分段错误.服务器和客户端都是操作系统的本地服务器.我认为我在指针中犯了一些错误并违反了一些指针规则.
这是代码:
Server.c
struct WinGoku goku,windows,gates;
struct WinGoku *array[3];
array[0] = &goku;
array[1] = &windows;
array[2] = &gates;
send(conSocket, array, sizeof(&array), 0);
Run Code Online (Sandbox Code Playgroud)
Client.c
struct WinGoku **array;
int rec = recv(mySocket, array, 4, 0);
printf("bytes Recieved %d\n", rec);
int i;
for(i = 0; i<3;i++)
{
printf("%s\n",array[i]->test);
}
Run Code Online (Sandbox Code Playgroud)
struct WinGoku仅包含char[50]我正在复制数据的地方strcpy.
发送和接收不返回-1,因此可以正确发送和接收数据.
我在做什么错?
我正在使用boost实现一些asio操作,遇到一个接口问题,在初始化时没有收到“处理程序”,但是之后,
这迫使我编写一个“忙”循环,我想做的是即使没有至少一个处理程序也要运行io_service,这可能吗?如何处理呢?等待服务的处理程序吗?这是我的代码。
/** : */
void Run () { while(true) {m_srv.run(); Sleep(1);} } // once 1 handler is inside service, thread will not be in busy loop
private: // members:
io_service m_srv;
Run Code Online (Sandbox Code Playgroud)
有什么建议么?谢谢
这是代码问题:(m_drv是操作boost :: thread(io_service :: run ..)的任务)
class App : public Base::Application
{
public:
/** : */
App(char* name, char* id) : Application(name, id), m_drv("NetTask"), m_worker("Worker"), m_acceptor(m_worker, Drv(), &OnAccept, 4567)
{
m_acceptor.Accept(Drv());
}
/** : */
inline DriverImp& Drv() { return static_cast<DriverImp&>(m_drv.Imp());}
/** : */
inline Reactor& Worker() …Run Code Online (Sandbox Code Playgroud) 我曾在非阻塞TCP中工作,因为在非阻塞情况下,读取和写入都会失败.如果没有可用数据,TCP非阻塞读取可能会失败,如果对等端的TCP缓冲区已满,TCP写入可能会失败(我希望TCP缓冲区大小为64K).
同样,recvfrom如果没有可用数据,UDP read()可能会失败.但UDP write(sendto)的失败案例是什么?我认为在UDP写入中不会出现任何非块错误.因为TCP写入发送数据并等待来自另一方的ACK.但这不是UDP写入的情况,它只会发送并且出来并且它不会等待来自对等方的任何ACK.如果它不发送到另一方意味着它的丢包.
我对UDP非阻塞写的理解是否正确?请解释 ?
我正在研究一个实时协议,为每个传输的数据包添加时间戳,我不明白代码行的含义.感谢帮助.
// ts for timestamp
unsigned int ts;
if(ts & 0xffff0000){
// do something
}
Run Code Online (Sandbox Code Playgroud) 我有logon.bat脚本,每次用户登录到Active Directory域的工作站时都会运行该脚本.
此脚本使用以下命令映射某些网络驱动器:
net use x: \\192.168.0.2\share1
net use y: \\192.168.0.3\share2
net use z: \\192.168.0.4\share3
Run Code Online (Sandbox Code Playgroud)
但是,对于某些工作站,此脚本在工作站本身完全建立自己的LAN连接之前运行.然后用户进入"开始"菜单>"计算机",并查看每个映射驱动器的红色X. 此时,网络已建立,因此如果他们点击红色X,它就会消失.不过,我希望logon.bat脚本在运行net-use命令之前验证网络是否已建立.
我见过这样的解决方案,需要在组策略上更改设置,或者需要更改罪魁祸首工作站上的设置.但是,我对在我当前的批处理脚本中解决此问题的解决方案感兴趣(不需要在该脚本之外的任何其他脚本依赖项).
我已经看到其他脚本解决方案只是将超时(或睡眠)放入批处理脚本中,以便在运行net use命令之前等待任意时间.这些解决方案提供的等待常数要么"将驱动器映射的时间比它们映射的时间稍晚",要么"仍然存在比网络更早建立网络命令的风险".
相反,我想要一个脚本,它会检查每一秒以查看网络是否已建立,然后(成功时)继续运行前面提到的"net use"命令.
如何在Windows批处理脚本中实现此目的?
windows network-programming batch-file mapped-drive active-directory
c ×6
c++ ×3
sockets ×3
boost-asio ×2
networking ×2
tcp ×2
windows ×2
batch-file ×1
boost ×1
busy-loop ×1
libpcap ×1
mapped-drive ×1
nonblocking ×1
operators ×1
pointers ×1
ssl ×1
struct ×1
udp ×1