标签: network-programming

在IPv4客户端/服务器应用程序中添加对IPv6的支持 - sin6_flowinfo和sin6_scope_id字段?

我致力于为多个应用程序实现IPv6支持,但我想知道这两个字段是什么.关于这一点的问题很少,所以我不确定我做对了.

  • 关于范围ID(sin6_scope_id) - 好吧,Q1,Q2,Q3Q4给了我关于范围ID的想法,我想我明白了.所以,我将不得不再添加一个配置参数,以使scope-id可配置.(我决定在这里添加,以防有人对此感兴趣).短时间 - 范围ID是唯一确定哪个设备应该处理流量所必需的 - 因为可能有多个接口,具有相同的IP,但具有不同的(接口?)ID.到现在为止还挺好.
  • 但是"流量信息"怎么样(sin6_flowinfo)
    • 它是为了什么?我找不到任何有趣的东西.我阅读了RFC,但它根本没有帮助我.
    • 是否有一些可能的值sin6_flowinfo(比如 - 几个值,如标志,这意味着什么),或者它就像sin6_scope_id- 可能是任何值,取决于设备,我正在尝试连接?
    • 我应该担心它,或者我只是离开它0(就像在Beej的网络编程指南中一样.是的,我尝试过,它有效,但我不确定它是否只适用于这种情况(如果它取决于它)在某些网络配置上),或者如果设置为0?它将始终有效?
    • 或者,也许,我应该让它可配置,我的意思是 - 添加一个配置选项,并让用户定义它的值?
    • google-ing"sin6_flowinfo"给出了结构定义和手册页,对这个领域没什么用处.任何有趣的来源?(可理解的一个......不是RFC:D)

编辑:嗯,在@glglgl的回答和提示之后,这sin6_flowinfo可能已经过时了,我发现了一些有趣的资料来源: RFC:IPv6流标签规范, IETF草案:流标签作为传输层Nonce, solaris维基百科的实用指南.
该字段不是过时的(或者我找不到这样的来源,这证实了这一点),但看起来0价值已经足够好了.

c sockets network-programming ipv6

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

跟踪特定的IP和端口

我在服务于http页面的远程服务器上的端口9100上运行了一个应用程序.在我进入服务器后,我可以卷曲localhost 9100并收到响应.

但是我无法使用浏览器访问同一个应用程序 http://ip:9100

我也无法从我的本地PC远程登录.我该如何调试?有没有办法跟踪特定的IP和端口组合,以查看它被阻止的位置?

任何Linux工具/命令/实用程序将不胜感激.

谢谢,穆尔塔扎

linux ubuntu networking network-programming

23
推荐指数
4
解决办法
12万
查看次数

对SSPI的调用失败,请参阅内部异常 - 无法联系本地安全机构

我有一个WPF应用程序,它使用SSLStream连接到服务器并发送/接收一些消息.我的代码更大程度上基于这个例子(SslTcpClient):https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v = vs.110).aspx .

这个工作好几个月了.但是,在获得此Windows更新(Windows 10版本1511和Windows Server 2016技术预览4的累积更新:2016年6月14日 - https://support.microsoft.com/en-us/kb/3163018)之后.我的应用开始报告此异常:

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The Local Security Authority cannot be contacted
   --- End of inner exception stack trace ---
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, …
Run Code Online (Sandbox Code Playgroud)

.net c# networking network-programming sspi

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

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

如何伪造udp-packet的源ip-address?

请考虑以下事项:
您的ISP为您提供动态IP地址(例如123.123.123.123).

我的问题很简单(答案可能不是):

是否可以将带有外部源IP(例如124.124.124.124)的单个udp数据包发送到fixed-ip服务器?我不需要从服务器得到答案.我只是想知道是否/如何使用伪造的源IP地址完成这种单向通信.

服务器,没有其他人不应该能够找到真正的客户端IP.

networking network-programming ip-address network-protocols

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

如何在C中完全销毁套接字连接

我使用socket在linux中创建了一个聊天客户端,我希望完全破坏连接.以下是代码的相关部分:

int sock, connected, bytes_recieved , true = 1, pid;  
char send_data [1024] , recv_data[1024];     
struct sockaddr_in server_addr,client_addr;    
int sin_size;
label:
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
    perror("Socket");
    exit(1);
}
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1)
{
    perror("Setsockopt");
    exit(1);
}
server_addr.sin_family = AF_INET;         
server_addr.sin_port = htons(3128);     
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1)
{
    perror("Unable to bind");
    exit(1);
}
if (listen(sock, 5) == -1)
{
    perror("Listen");
    exit(1);
}
printf("\nTCPServer Waiting for client on port …
Run Code Online (Sandbox Code Playgroud)

c sockets linux network-programming

22
推荐指数
3
解决办法
6万
查看次数

在Android中实现websocket客户端的简单方法是什么?以下示例是否正确?

我试图使用在Android中实现WebSocket客户端的类.但是我收到以下错误:

12-07 11:22:46.286 31579-31579/com.domain.wsocketchat W/System: ClassLoader referenced unknown path: /data/app/com.domain.wsocketchat-2/lib/arm
12-07 11:22:46.392 31579-31579/com.domain.wsocketchat W/System.err: an error occurred:java.net.SocketException: socket failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)

我正在使用的课程如下:

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_10;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

public class EmptyClient extends WebSocketClient {
    public EmptyClient(URI serverUri, Draft draft) {
        super(serverUri, draft);
    }

    public EmptyClient(URI serverURI) {
        super(serverURI);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        System.out.println("new connection opened");
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("closed with exit code " + …
Run Code Online (Sandbox Code Playgroud)

android network-programming websocket java-websocket

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

如何以编程方式在iOS中通过IPv6获取远程MAC地址

我需要找到一个解决方案,如何从WiFi网络中的其他设备获取MAC地址.有一个很好的方法如何为IPv4执行此操作(iOS应用程序如何获取MAC地址?),但如何为IPv6执行此操作?由于ARP被NDP(邻居发现协议)取代,后一种方法不起作用.如果有人能帮助我,我将不胜感激.

network-programming mac-address ipv6 ios tvos

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

使用PACKET_MMAP和PACKET_TX_RING发送数据比"正常"(没有)慢

我正在使用PACKET_MMAP套接字选项在C中编写流量生成器来创建环形缓冲区以通过原始套接字发送数据.环形缓冲区充满了以太网帧以进行发送和sendto调用.环形缓冲区的全部内容通过套接字发送,这应该比在内存中具有缓冲区提供更高的性能,并且sendto对于需要发送的缓冲区中的每个帧重复调用.

当不使用PACKET_MMAP时,在调用单帧时,sendto从用户区内存中的缓冲区复制到内核内存中的SK buf,然后内核必须将数据包复制到NIC访问的内存中,并将NIC发送到DMA将帧放入其自己的硬件缓冲区并将其排队以进行传输.当使用PACKET_MMAP套接字选项时,mmapped内存由应用程序分配并链接到原始套接字.应用程序将数据包放入mmapped缓冲区,调用sendto而不是内核必须将数据包复制到SK buf中,它可以直接从mmapped缓冲区中读取它们.还可以从环形缓冲区而不是单独的分组/帧读取分组的"块".因此,性能提升是一个系统调用,用于复制多个帧,每个帧一次复制操作,以使其进入NIC硬件缓冲区.

当我将使用PACKET_MMAP的套接字的性能与"普通"套接字(其中包含单个数据包的char缓冲区)进行比较时,根本没有性能优势.为什么是这样?在Tx模式下使用PACKET_MMAP时,每个环形块只能放入一个帧(而不是像Rx模式那样每个环形块有多个帧)但是我创建了256个块,所以我们应该在一次sendto调用中发送256帧吗?

使用PACKET_MMAP进行性能main()调用packet_tx_mmap():

bensley@ubuntu-laptop:~/C/etherate10+$ sudo taskset -c 1 ./etherate_mt -I 1
Using inteface lo (1)
Running in Tx mode
1. Rx Gbps 0.00 (0) pps 0   Tx Gbps 17.65 (2206128128) pps 1457152
2. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.08 (2385579520) pps 1575680
3. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.28 (2409609728) pps 1591552
4. Rx Gbps 0.00 …
Run Code Online (Sandbox Code Playgroud)

c sockets performance network-programming circular-buffer

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

什么会导致UDP数据包被发送到localhost时被丢弃?

我正在发送非常大(64000字节)的数据报.我意识到MTU远小于64000字节(典型值大约是1500字节,来自我的阅读),但我怀疑会发生两件事之一 - 要么没有数据报就能通过(所有大于1500字节)会被静默删除或导致抛出错误/异常)或64000字节数据报将被分成大约43个1500字节的消息并透明地传输.

从长远来看(2000 + 64000字节数据报),数据报的大约1%(即使是LAN似乎异常高)也会被丢弃.我可能期望通过网络,数据报可能无序到达,被丢弃,过滤等等.但是,在localhost上运行时我没想到这一点.

是什么导致无法在本地发送/接收数据?我意识到UDP是不可靠的,但我没想到它在localhost上如此不可靠.我想知道它是否只是一个时间问题,因为发送和接收组件都在同一台机器上.

为了完整起见,我已经包含了发送/接收数据报的代码.

发送:

DatagramSocket socket = new DatagramSocket(senderPort);

int valueToSend = 0;

while (valueToSend < valuesToSend || valuesToSend == -1) {
    byte[] intBytes = intToBytes(valueToSend);

    byte[] buffer = new byte[bufferSize - 4];

     //this makes sure that the data is put into an array of the size we want to send
    byte[] bytesToSend = concatAll(intBytes, buffer);

    System.out.println("Sending " + valueToSend + " as " + bytesToSend.length + " bytes");

    DatagramPacket packet = new DatagramPacket(bytesToSend,
                        bufferSize, …
Run Code Online (Sandbox Code Playgroud)

java udp network-programming

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