标签: network-programming

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 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 network-programming tcp libpcap

1
推荐指数
1
解决办法
1779
查看次数

提升asio客户端身份验证

我有一个基于客户端服务器的c ++应用程序,它通过网络进行通信(使用boost asio),我打算将这个客户端应用程序分发给我的客户.我的问题是我不知道如何阻止来自其他应用程序的连接请求,这就是我如何确保只有我的客户端应用程序能够连接到我的服务器.我认为如果没有建立连接就没有办法做到这一点,那么验证请求来自我的客户端的最佳方法是什么?

c++ network-programming boost-asio network-security

1
推荐指数
1
解决办法
1033
查看次数

当两个线程尝试写入同一个tcp套接字simultaneouslu时,同步问题

我有20个线程,一次在单个tcp套接字上发送数据并接收数据.当我运行我的应用程序时,我没有看到任何同步问题,但根据我的理解,当两个线程同时尝试写入tcp套接字或当一个线程正在写入而其他线程正在读取时,可能会出现一些问题.

如果我的理解是正确的,为什么我不会面临任何错误?

c sockets windows network-programming tcp

1
推荐指数
2
解决办法
1505
查看次数

如何创建/设计数据结构?

我是一个知道相当多的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++ networking struct network-programming data-structures

1
推荐指数
1
解决办法
126
查看次数

这部分代码在做什么?

我是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)

c sockets ssl networking network-programming

1
推荐指数
1
解决办法
90
查看次数

为什么在本地进程之间传递指针时会导致分段错误?

我从服务器传递一个指针数组到客户端.但是在客户端,当我拒绝接收到的数组时,我会得到分段错误.服务器和客户端都是操作系统的本地服务器.我认为我在指针中犯了一些错误并违反了一些指针规则.

这是代码:

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,因此可以正确发送和接收数据.

我在做什么错?

c pointers network-programming segmentation-fault

1
推荐指数
2
解决办法
333
查看次数

通过boost :: asio :: io_service运行避免繁忙的循环

我正在使用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)

c++ boost network-programming boost-asio busy-loop

1
推荐指数
1
解决办法
1509
查看次数

UDP非阻塞写入失败

我曾在非阻塞TCP中工作,因为在非阻塞情况下,读取和写入都会失败.如果没有可用数据,TCP非阻塞读取可能会失败,如果对等端的TCP缓冲区已满,TCP写入可能会失败(我希望TCP缓冲区大小为64K).

同样,recvfrom如果没有可用数据,UDP read()可能会失败.但UDP write(sendto)的失败案例是什么?我认为在UDP写入中不会出现任何非块错误.因为TCP写入发送数据并等待来自另一方的ACK.但这不是UDP写入的情况,它只会发送并且出来并且它不会等待来自对等方的任何ACK.如果它不发送到另一方意味着它的丢包.

我对UDP非阻塞写的理解是否正确?请解释 ?

c sockets udp network-programming nonblocking

1
推荐指数
1
解决办法
3742
查看次数

"ts&0xffff0000"的目的是什么?

我正在研究一个实时协议,为每个传输的数据包添加时间戳,我不明白代码行的含义.感谢帮助.

// ts for timestamp
unsigned int ts;


if(ts & 0xffff0000){
 // do something
}
Run Code Online (Sandbox Code Playgroud)

c network-programming operators

1
推荐指数
1
解决办法
3820
查看次数

批处理脚本 - 等到网络建立

我有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

1
推荐指数
2
解决办法
1万
查看次数