導航:首頁 > 編程語言 > 乙太網socket編程

乙太網socket編程

發布時間:2024-02-04 03:03:15

㈠ AB PLC和三菱Q系列乙太網SOCKET通訊如何實現

用CCLINK通訊吧!Q為主站,另外一個PLC為從站。要傳送數據直接在寄存器和位元件中。

㈡ 利用C++選擇乙太網口進行通信

服務程序在創建了套介面後,在綁定埠時指定綁定到某張網卡對應的IP地址即可,如下程序:
====================================================================
#include <winsock2.h>
#include <stdio.h>

int main(void) {

//----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("Error at WSAStartup()\n");
return 1;
}

//----------------------
// Create a SOCKET for listening for
// incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}

//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
//在此修改你的服務程序想綁定到哪個網卡對應的IP地址上,則寫在下面,
//因為一個IP對應著一個網卡
service.sin_addr.s_addr = inet_addr("127.0.0.1");
//在此修改你的服務程序想綁定到哪個埠上,則寫在下面
service.sin_port = htons(27015);

if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
}

//----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {
printf("Error listening on socket.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
}

//----------------------
// Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;
printf("Waiting for client to connect...\n");

//----------------------
// Accept the connection.
AcceptSocket = accept( ListenSocket, NULL, NULL );
if (AcceptSocket == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
} else
printf("Client connected.\n");

// No longer need server socket
closesocket(ListenSocket);

WSACleanup();
return 0;
}

㈢ 監聽技術的乙太網上數據幀的監聽剖析

乙太網上的數據幀主要涉及Tcp/ip協議,針對以下幾個協議的分析:IP,ARP,RARP,IPX,其中重點在於ip和 arp協議,這兩個協議是多數網路協議的基礎,因此把他們研究徹底,就對大多數的協議的原理和特性比較清楚了。 由於各種協議的數據幀個不相同,所以涉及很多的數據幀頭格式分析,接下來將一一描述。在linux 下監聽網路,應先設置網卡狀態,使其處於雜混模式以便監聽網路上的所有數據幀。然後選擇用Linux socket 來截取數據幀,通過設置socket() 函數參數值,可以使socket截取未處理的網路數據幀,關鍵是函數的參數設置,下面就是有關的程序部分:AF_INET=2 表示 internet ip protocolSOCK_PACKET=10 表示 截取數據幀的層次在物理層,既不作處理。htons(0x0003)表示 截取的數據幀的類型為不確定,既接受所有的包。總的設定就是網卡上截取所有的數據幀。這樣就可以截取底層數據幀,因為返回的將是一個指向數據的指針,為了分析方便,我設置了一個基本的數據幀頭結構。Struct etherpacket{struct ethhdr eth; struct iphdr ip; struct tcphdr tcp; char buff; } ep;將返回的指針賦值給指向數據幀頭結構的指針,然後對其進行分析。以下是有關協議的報頭:ethhdr 這是乙太網數據幀的mac報頭:|48bit 目的物理地址 | 48bit 源物理地址 | 16bit協議地址|相應的數據結構如下struct ethhdrunsigned char h_dest[ETH_ALEN];unsigned char h_source[ETH_ALEN];unsigned short h_proto;其中h_dest是48位的目標地址的網卡物理地址,h_source 是48位的源地址的物理網卡地址。H_proto是16位的乙太網協議,其中主要有0x0800 ip,0x8035.X25,0x8137 ipx,0x8863-0x8864 pppoe(這是Linux的 ppp),0x0600 ether _loop_back ,0x0200-0x0201 pup等。Iphdr 這是ip協議的報頭:由此可以定義其結構如下:這是Linux 的ip協議報頭,針對版本的不同它可以有不同的定義,我們國內一般用BIG的定義,其中version 是ip的版本,protocol是ip的協議分類主要有0x06 tcp.0x11 udp,0x01 icmp,0x02 igmp等,saddr是32位的源ip地址,daddr是32位的目標ip地址。相應的數據結構:struct arphdr {unsigned short int ar_hrd; unsigned short int ar_pro; unsigned char ar_hln;unsigned char ar_pln; unsigned short int ar_op;#if 0unsigned char _ar_sha[ETH_ALEN];unsigned char _ar_sip;unsigned char _ar_tha[ETH_ALEN];unsigned char _ar_tip;#end if};這是linux 的arp 協議報頭,其中ar_hrd 是硬體地址的格式,ar_pro協議地址的格式,ar_hln是硬體地址的長度,ar_pln時協議地址的長度,ar_op是arp協議的分類0x001是arp echo 0x0002 是 arp reply.接下來的分別是源地址的物理地址,源ip地址,目標地址的物理地址,目標ip地址。Tcphdr ip協議的tcp協議報頭以下是相應數據結構:struct tcphdr{u_int16_t source; u_int16_t dest; u_int32_t seq; u_int32_t ack_seq; # if _BYTE_ORDER == _LITTLE _ENDIANu_int16_t resl:4; u_int16_t doff:4;u_int16_t fin:1;u_int16_t syn:1; u_int16_t rst:1;u_int16_t psh:1;u_int16_t ack:1; u_int16_t urg:1;u_int16_t res2:2; #elif _BYTE _ORDER == _BIG _ENDIANu_int16_t doff:4; u_int16_t res1:4;u_int16_t res2:2;u_int16_t urg:1; u_int16_t ack:1;u_int16_t psh:1;u_int16_t rst:1; u_int16_t syn:1;u_int16_t fin:1; #else#error Adjust your defines#endifu_int16_t window; u_int16_t check;u_int16_t urg_ptr;};這是Linux 下tcp協議的一部分與ip協議相同取BIG,其中source是源埠,dest 是目的埠,seq是s序,ack_seq是a序號,其餘的是tcp的連接標志其中包括6個標志:syn表示連接請求,urg 表示緊急信息,fin表示連接結束,ack表示連接應答,psh表示推棧標志,rst表示中斷連接。window是表示接受數據窗口大小,check是校驗碼,urg ptr是緊急指針。Udphdr 這是udp協議報頭struct udphdr {u_int16_t source; u_int16_t dest;u_int16_t len;u_int16_t check;}這是Linux下ip協議中udp協議的一部分,結構很明顯 source 源埠,dest目的埠,len udp 長度,check 是校驗碼。Icmphdr 這是ip協議的icmp協議的報頭struct icmphdr{u_int8_t type;u_int8_t code;u_int16_t checksum;union{struct {u_int16_t id;u_int16_t sequence;} echo;u_int32_t gateway;struct{u_int16_t_unused;u_int16_t mtu;}frag;} un;};這是linux下的ip協議中的icmp的協議,這裡面主要的是前兩項參數,其中type是icmp協議的類型,而code 則是對type類型的再分析。如:type 0x03 是表示unsearchable,這時code的不同表示了不同的unsearchable :0x00表示網路不可尋,0x01表示主機不可尋,0x02表示協議不可尋,0x03表示埠不可尋,0x05表示源路由失敗,0x06網路不可知,0x07主機不可知。Igmphdr 這是ip協議的igmp協議報頭struct igmphdr{ _u8 type;_u8 code;_u16 csum;_u32 group;};這是Linux下的ip協議中的igmp協議,協議中主要是前面兩個屬性,Type表示igmp 協議的信息類型,code表示routing code. 然後,將截取的數據幀的地址賦值給定義的結構.由此可根據不同的結構分析數據,得到我們需要的信息 。

閱讀全文

與乙太網socket編程相關的資料

熱點內容
往復式壓縮氣缸過熱的原因 瀏覽:839
4u伺服器機箱怎麼賣 瀏覽:461
如何自學葡萄牙語app 瀏覽:456
擺來擺去的游戲解壓 瀏覽:270
centos注銷命令 瀏覽:859
vue多端編譯 瀏覽:753
程序員qq表白代碼編輯 瀏覽:893
聯想伺服器怎麼進後台 瀏覽:114
安卓定製rom怎麼刷 瀏覽:539
三層交換機的配置命令 瀏覽:110
49演算法公式 瀏覽:790
求最小生成樹演算法代碼及運行圖片 瀏覽:930
python掃雷計數 瀏覽:879
什麼安卓手機品牌最保值 瀏覽:846
編程貓買房子 瀏覽:134
c語言系列編程 瀏覽:742
符合國標加密標准技術 瀏覽:497
加密狗介面會壞嗎 瀏覽:625
javame開發 瀏覽:380
python3偽裝瀏覽器 瀏覽:242