當前位置:首頁 » 編程軟體 » tcp源碼編譯

tcp源碼編譯

發布時間: 2022-06-28 08:40:11

Ⅰ 如何偽造tcp數據包,並進行正確的校驗的例子演示及源碼

下面的程序是在linux下進行tcp偽造的一個例子:涉及原始套接字和tcp的校驗演算法

/************************tcp_pseudo.c********************/
/** Author :cbchen. */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INTERFACE "eth0"
#define IP ""
/*Prototype area*/
int Open_Packet_Socket();
int Open_Raw_Socket();
int Set_Promisc(char *interface, int sock);
void send_tcp_ack(int sockfd,struct sockaddr_in *addr);
unsigned short check_sum(unsigned short *addr,int len);
struct ip *iprecv;
struct tcphdr *tcprecv;
struct sockaddr_in addr;

int main()
{
int sockfd,sendfd,bytes_recieved;

char buffer[1518];
u_char *buf2;
char saddr[20],daddr[20];

sockfd=Open_Packet_Socket();
sendfd=Open_Raw_Socket();
//printf("sockfd:%d/tsendfd:%d/n",sockfd,sendfd);

int on=1;
/******** 設置IP數據包格式,告訴系統內核模塊IP數據包由我們自己來填寫 ***/
setsockopt(sendfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
Set_Promisc(INTERFACE, sockfd);
int count=1;

while(1)
{

bytes_recieved = recvfrom(sockfd, buffer, 1518, 0, NULL, NULL);

buf2=buffer;
buf2+=14;
iprecv=(struct ip *)buf2;
//iprecv+=sizeof(struct ethhdr*);
/*See if this is a TCP packet*/
if(iprecv->ip_v == 4&iprecv->ip_p == 6) {
printf("---------------------------Number %d packet-----------------------------------------------/n",count);
count++;
printf("/nBytes received ::: %5d/n",bytes_recieved);
printf("ip version:%u/n",iprecv->ip_v);

printf("IP包頭解碼:/n");
printf("Source ip:%s/t",inet_ntoa(iprecv->ip_src));
printf("Dest ip:%s/t",inet_ntoa(iprecv->ip_dst));
printf("proto:%u/n",iprecv->ip_p);
buf2+=iprecv->ip_hl<<2;
printf("TCP包頭解碼:/n");
tcprecv = (struct tcphdr*)buf2;
//tcprecv = (struct tcphdr *)(buffer + (iprecv->ip_hl<<2));
printf("Source port :::%d/n",ntohs(tcprecv->source));
printf("Dest port :::%d/n",ntohs(tcprecv->dest));
printf("seq num:%u/n",ntohl(tcprecv->seq));
printf("ack num:%u/n",ntohl(tcprecv->ack_seq));
printf("urg:%x/tack:%x/tpsh:%x/trst:%x/tsyn:%x/tfin:%x/n",tcprecv->urg,tcprecv->ack,tcprecv->psh,tcprecv->rst,tcprecv->syn,tcprecv->fin);
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
//addr2.sin_port=htons(thdr->source);
addr.sin_port=tcprecv->source;
//addr2.sin_addr=iphdr->ip_src;
addr.sin_addr=iprecv->ip_src;

/********* 發送阻隔包了!!!! ****/
if(tcprecv->syn==1&tcprecv->urg!=1&tcprecv->ack!=1&tcprecv->psh!=1&tcprecv->rst!=1&tcprecv->fin!=1)
{
//send_tcp_ack(sendfd,&addr);
//printf("It's a syn pocket!/n");
}
}
}
close(sockfd);
close(sendfd);
}
//end main

/******* 發送阻隔包的實現 *********/
/*
void send_tcp_ack(int sockfd,struct sockaddr_in *addr)
{
struct send_tcp
{
struct iphdr ip;
struct tcphdr tcp;
} send_tcp;

struct pseudo_header
{
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct tcphdr tcp;
} pseudo_header;

int tcp_socket;
struct sockaddr_in sin;
int sinlen;

// form ip packet
send_tcp.ip.ihl = 5;
send_tcp.ip.version = 4;
send_tcp.ip.tos = 0;
send_tcp.ip.tot_len = htons(40);
send_tcp.ip.frag_off = 0;
send_tcp.ip.ttl = 64;
send_tcp.ip.protocol = IPPROTO_TCP;
send_tcp.ip.check = 0;
send_tcp.ip.saddr = iprecv->ip_dst.s_addr;
send_tcp.ip.daddr = addr->sin_addr.s_addr;

// form tcp packet
send_tcp.tcp.dest = addr->sin_port;
send_tcp.tcp.source = tcprecv->dest;
send_tcp.tcp.ack_seq = htonl(ntohl(tcprecv->seq)+0x01);
send_tcp.tcp.res1 = 0;
send_tcp.tcp.doff = 5;
send_tcp.tcp.fin = 0;
send_tcp.tcp.syn = 1;
send_tcp.tcp.rst = 0;
send_tcp.tcp.psh = 0;
send_tcp.tcp.ack = 1;
send_tcp.tcp.urg = 0;
send_tcp.tcp.res2 = 0;
send_tcp.tcp.window = htons(512);
send_tcp.tcp.check = 0;
send_tcp.tcp.urg_ptr = 0;
send_tcp.tcp.seq = tcprecv->seq;

// set fields that need to be changed
//send_tcp.tcp.source++;
send_tcp.ip.id = 0 ;
//send_tcp.tcp.seq++;
send_tcp.tcp.check = 0;
send_tcp.ip.check = 0;

// calculate the ip checksum
send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20);

// set the pseudo header fields
pseudo_header.source_address = send_tcp.ip.saddr;
pseudo_header.dest_address = send_tcp.ip.daddr;
pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP;
pseudo_header.tcp_length = htons(20);
b((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32);
sinlen = sizeof(sin);
int count;
for(count=0;count<2;count++){
if(sendto(sockfd, &send_tcp, 40, 0, (struct sockaddr *)addr,sizeof(struct sockaddr))<0)
{
printf("sendto error!/n");
}
else
{
printf("send packet ok!/n");
}

}
*/

/* 下面是首部校驗和的演算法 */
unsigned short in_cksum(unsigned short *addr, int len) /* function is from ping.c */
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer =0;

while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
{
*(u_char *)(&answer) = *(u_char *)w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}
int Open_Packet_Socket()
{
int sock;
sock=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL));
if (sock==-1)
{
perror("socket");
exit(errno);
}
printf("sockfd:%d/n",sock);
return(sock);
}
int Open_Raw_Socket()
{
int sock;
sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
if (sock==-1)
{
perror("socket");
exit(errno);
}
printf("sendfd:%d/n",sock);
return(sock);
}

int Set_Promisc(char *interface, int sockfd )
{
struct ifreq ifr;
strncpy(ifr.ifr_name,interface,strnlen(interface)+1);
if (ioctl(sockfd,SIOCGIFFLAGS,&ifr)==-1)
{
perror("ioctl1");
exit(errno);
}
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl(sockfd,SIOCSIFFLAGS,&ifr))
{
perror("ioctl2");
exit(errno);
}

// printf("Setting interface ::: %s ::: to promisc...ok..../n", interface);
return(1);
}

Ⅱ 求c語言編程的Modbus TCP源代碼

從機的可以用freemodbus,我用過RTU的,很好用。
TCP的沒用過,但freemodbus的代碼格式很清晰,移植起來很簡單。
http://www.modbus.org/tech.php
另外可以去MODBUS的網站上找找,看有沒有合適的庫可以用。

Ⅲ tcp/ip 源碼剖析 怎麼樣

先認清你自己學習的出發點吧, 是應用層面方向還是內核協議棧

應用層面,我不是很了解

內核協議棧個人學習流程大概如下:

首先看TCP/IP卷2,理解2層(MAC地址), 3層(IP, 路由),4層(TCP,UDP,ICMP,IGMP)
這里主要理解的框架,先把網路協議層從下到上(或從上到下)理一遍

然後,建議你看<深入理解Linux網路技術內幕> 能看英文版最好

按照那本書的目錄,找找網上的資料
稍微理解下sk_buff和net_device這兩個結構
(不要想著去看懂, 要完全看懂這個結構,會花費比較多的時間,而且還要結合網路子系統中的各個應用)

然後,直接把整本書完整看一遍,不要刻意去扣細節,第1遍看這本書只是為了把網路子系統的內部框架建立起來

看完1遍,肯定有自己的見解了,然後,再根據自己需要的,去扣代碼細節

代碼方面,建議不要找最新的代碼,我看這本書選的2.6.16的,最新代碼的話,和這本書對應不上,不便於理解基礎

<深入理解Linux網路技術內幕> 這本書,除了沒有TCP/UDP的詳細解說,至少我沒發現比他還好的書

Ⅳ 求 基於java的Modbus/TCP協議 源代碼

public static void TestModbus() throws Exception{
IpParameters params = new IpParameters();
params.setHost("localhost");//地址
params.setPort(502);//埠
ModbusFactory factory = new ModbusFactory();
ModbusMaster master = factory.createTcpMaster(params, true);

// 初始化
try {
master.init();
readHoldingRegistersTest(master,1,0,3);

} catch (ModbusInitException e) {
e.printStackTrace();
} finally {
master.destroy();
}

}

public static void main(String[] args) {
try {
TestModbus();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

private static void readHoldingRegistersTest(ModbusMaster master,
int slaveId, int start, int len) {
try {
// ReadInputRegistersRequest request = new ReadInputRegistersRequest(
// slaveId, start, len);
// ReadInputRegistersResponse response = (ReadInputRegistersResponse) master
// .send(request);
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
slaveId, start, len);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
.send(request);
if (response.isException()) {
System.out.println("Exception response: message="
+ response.getExceptionMessage());
} else {
ByteQueue byteQueue= new ByteQueue(12);
response.write(byteQueue);
System.out.println(byteQueue);

System.out.println(Arrays.toString(response.getShortData()));
short[] list = response.getShortData();
for(int i = 0; i < list.length; i++){
System.out.print(list[i] + " ");
}
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}

Ⅳ tcp/ip共享資源系統源碼

【問題描述】: 電腦運行慢,操作起來電腦需要反映一段時間。 【原因分析】: 虛擬內存不能及時釋放,虛擬內存設置較小,硬體溫度過高。 【簡易步驟】: 1、【軟體小助手】中的【一鍵加速】 2、【功能大全】中的【魯大師】 3、手動檢查虛擬內存 【解決方案】 1、【軟體小助手】中的【一鍵加速】/span> 2、【功能大全】中的【魯大師】 3、手動檢查虛擬內存

Ⅵ TCP客戶端程序源代碼如何編寫

int client() { system("color 0a"); //修改DOS窗口顏色,是其成0A。 WORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); //啟動WINSOCKET if(nResult !=0) { printf("啟動Winsock失敗!\n"); } SOCKET sc=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //創建套接字 if(sc==INVALID_SOCKET) { printf("創建套接字失敗!\n"); } SOCKADDR_IN addrSc; addrSc.sin_family=AF_INET; addrSc.sin_port=htons(portNum); //保證位元組順序 char IP[20]; again: printf("請輸入伺服器的IP地址:"); gets(IP); if( -1==inet_addr(IP) ) //循環檢測IP地址是否合法 { printf("IP地址錯誤!\n"); goto again; } addrSc.sin_addr.S_un.S_addr=inet_addr(IP); int b=0; while(b<5) //檢測5次,如果伺服器在此時間內啟動,則進行連接 { nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR)); //套接字連接 Sleep((DWORD)100); //延時1秒 if(nResult==SOCKET_ERROR) { printf(" %d 次連接失敗!\n",b+1); } else break; b++; } if(nResult==SOCKET_ERROR) { printf("登陸超時,請重新登陸!\n"); goto again; } char *buf="連接成功!"; //向服務端驗證連接成功 nResult=send(sc,buf,strlen(buf)+1,0); if(nResult==SOCKET_ERROR) { printf("5.套接字發送數據失敗!\n"); return 0; } char mess[M]; nResult =recv(sc,mess,strlen(mess),0); //接受服務端的連接驗證信息 if(nResult == -1 ) //判斷服務端是否關閉 { printf("\n服務端已斷開\n"); system("pause"); exit(0); } printf("%s\n",mess); tianle: system("cls"); //清屏 puts("\n\n"); puts(" * * "); puts(" * 歡·迎·使·用·局·域·網·文·件·發·送·工·具 *"); puts(" * (客 戶 端) * "); puts(" * * "); puts(" * * "); puts(" * 請等待服務端的相應操作 * "); puts(" * * "); puts(" * * "); puts(" * 天樂軟體工作室製作 * "); puts(" * 2008-3-1 * "); puts(" * 版權所有★歡迎傳播 * "); puts("全屏(退出全屏)操作請按:ALT+ENTER\n"); char rMess[100]; nResult=recv(sc,rMess,strlen(rMess),0); //接收服務端發來的操作請求 if(nResult==-1) //判斷服務端是否關閉 { printf("\n服務端已斷開\n"); system("pause"); goto tianle; } printf("%s\n",rMess); char ch; char str[100]; gets(str); ch=str[0]; while( ch!='Y' && ch!='y' && ch!='N' && ch!='n' ) //處理客戶端的錯誤輸入 { printf("輸入有誤,請重新輸入(Y/N):"); gets(str); ch=str[0]; } send(sc,&ch,sizeof(char),0); //向服務端反饋選擇,並執行相應操作 if(strcmp(rMess,"服務端向你傳送文件,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') ) { receiveFile(sc); } if(strcmp(rMess,"服務端向你發起聊天,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') ) { chatting_client(sc); } if(ch=='N' || ch=='n') { printf("你拒絕了!\n"); system("pause"); } system("cls"); goto tianle; nResult=closesocket(sc); //關閉套接字 if(nResult==SOCKET_ERROR) { printf("8.關閉套接字失敗!\n"); return 0; } }

滿意請採納

Ⅶ 用tcp ip進行網際互聯的配套源碼需要在xinu中編譯

[cpp] view plain
用TCP/IP進行網際互聯源代碼編譯修改

1./usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in TCPecho.o
/lib/libc.so.6: could not read symbols: Bad value

刪除源文件中的 extern int errno
改為 #include<errno.h>

2. 出現u_short,u_long未聲明
在源文件中添加typedef unsigned short u_short;
typedef unsigned long u_long

3.類似提示需要目標/usr/include/sys/ttydev.h
可用locate先定位後,再修改
可能需要修改$I/machine/param.h為 $S/param.h
其他類似

4.phe->h_addr 需要修改成*(phe->h_addr_list)

Ⅷ 如何編寫簡單的socket網路程序 如何編寫基於TCP協議的網路程序

下面是個人用了一個40分鍾左右的時間編寫的程序,在這編寫過程中,非常重要的一點就是: 要理解 tcp協議編寫程序的原理,即編寫伺服器端的過程,以及編寫客戶端的過程。 只要把握這兩點就可以很容易編寫出來了,但是要快速編寫出這個程序,那麼VC6.0開發工具里,最好要安裝一個番茄插件,這個插件可以快速提高你的編寫程序的效率,還有也要安裝msdn 文檔,這樣在編寫過程中,遇到對某個函數的參數想不全的時候,使用msdn就能快速幫你回憶了。 呵呵,如果你那一天去面試一家牛逼的公司的哇,很有可能就是 在筆試完成之後,就要進行機試了,這就完全考查出你的真正編程水平了。 能在極短時間里完成一個socket網路程序,那麼就可以令面試官感到非常滿意了。 不過,這個程序,還沒有連接資料庫,以後再繼續搞了。
如果你去面試 深圳科技園 那家 偉易達 集團公司的軟體工程師的哇,那麼機試題目就是這個。 當時我去面試,首先進行筆試,面試官對我筆試成績比較滿意,所以就叫我留下來吃頓飯,下午進行機試。 當時我應聘崗位是Linux系統工程師C語言, 可是筆試題目,不但考核C,還考核C++,JavaScript,html。 我感覺好奇怪,心裡想,好像我是應聘VC++開發那個崗位了。 於是我等到下午,他拿來機試題目之時,才真正明白,果然是他要安排我從事VC++開發了,題目就是:編寫基於TCP/IP協議網路程序,並實現簡單的聊天程序,而且要連接資料庫。 當時我又失望了。 於是我就提出,我不想做這個題目,因為我是想應聘Linux系統C語言開發的。 就這樣失望的走了。
下面是個人完全能運行的代碼:
伺服器端源碼:
#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main()
{

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}
SOCKET socketServer=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_port=htons(6000);
bind(socketServer, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
listen(socketServer, 5);
SOCKADDR_IN addrClient;
int addrLen=sizeof(SOCKADDR_IN);
char sendBuf[100];
char recvBuf[100];
int i=1;
while(1)
{
printf("伺服器端等待第%d個客戶端連接請求...\n", i++);
SOCKET newsocketServer=accept(socketServer,(struct sockaddr *)&addrClient, &addrLen);
if(newsocketServer!=INVALID_SOCKET)
{
printf("伺服器端與客戶端連接成功...\n");
}
memset(sendBuf,0,100);
sprintf(sendBuf,"Welcome you to come here");
send(newsocketServer, sendBuf, strlen(sendBuf)+1,0);
memset(recvBuf,0,100);
recv(newsocketServer,recvBuf,100,0);
printf("伺服器端收到信息:%s\n",recvBuf);
closesocket(newsocketServer);
}
WSACleanup();
return 0;
}
此文章來自於個人博客: 阿浪博客 http://blog.163.com/wenxianliang08@126/
客戶端源碼:
#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main()
{

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}

SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrServer;

addrServer.sin_family=AF_INET;

addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrServer.sin_port=htons(6000);

char sendBuf[100];

char recvBuf[100];
printf("客戶端向伺服器端連接請求...\n");
int Isconnect=connect(socketClient, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
if(Isconnect!=0)
{
printf("客戶端無法連接伺服器端...\n");
return 0;
}
printf("客戶端已成功連接伺服器端...\n");
memset(recvBuf,0,100);

recv(socketClient,recvBuf,100,0);
printf("客戶端收到信息:%s\n",recvBuf);
memset(sendBuf,0,100);

sprintf(sendBuf,"Hello , I am Mr Wen !");

send(socketClient, sendBuf, strlen(sendBuf)+1,0);

closesocket(socketClient);

WSACleanup();

return 0;
}

Ⅸ 求TCP/IP 源代碼 要求有中文注釋~~~~~

lz說的應該不是協議,而是實現TCP/IP協議內容的具體代碼,如C語言等;《用TCP/IP進行網際互聯第二卷:設計、實現與內核》(第三版)【Internetworking
With
TCP/IP
Vol
II:Designed,Implementation,and
Internals
Third
Edition】上有C代碼實現,但沒有中文注釋,只有英文注釋,我想應該沒有中文注釋教材的吧,有也不好找的,反正我沒見過,呵呵!

Ⅹ 如何編程使上位機(界面c#)與下位機(單片機keil c)通過TCP/UDP協議來實現通信,最好有源代碼,謝謝~~

看來兄弟是想用單片機弄網路終端啊,但是你的問題描述不夠精準, 如果你是想單片機和PC之間實現ip/tcp方式通訊, 那麼在單片機端有支持這一協議可以和串口連接的的晶元, PC端的程序實際上你沒必要求什麼源碼, 有源碼你也不見得編譯過去, 這個看看C#關於網路編程的幾步走就行了, 很簡單的. 這個方式實際最後還是單片機的串口在起作用, 但是好處是可以遠距離和多設備通信, 不知道這個是不是你的本意, 如果你僅僅是為了完成實驗想要實現單片機和winform的通訊那麼沒必要非用tcp協議, 串口還是很方便的, 你可以winform端綁定一個埠, 然後用VSPM虛擬串口軟體來與單片機通訊, 外設就稍多了.希望我的回答可以幫到你, 不明白的可以追問!

熱點內容
convertlinux 發布:2024-05-02 18:20:00 瀏覽:704
zxingandroid簡化 發布:2024-05-02 17:47:53 瀏覽:189
貴州銀行卡查詢密碼是什麼 發布:2024-05-02 17:47:17 瀏覽:119
颶風演算法沒用 發布:2024-05-02 17:41:41 瀏覽:350
android鈴聲設置 發布:2024-05-02 17:40:01 瀏覽:485
php日記本 發布:2024-05-02 17:28:22 瀏覽:850
msc拒絕訪問 發布:2024-05-02 17:19:09 瀏覽:122
php函數漏洞 發布:2024-05-02 17:15:26 瀏覽:963
linux訪問localhost 發布:2024-05-02 17:04:11 瀏覽:880
劍三自動任務腳本 發布:2024-05-02 16:59:42 瀏覽:526