C解協議
A. c語言編程協議
協議一般是具體到某類產品時才提到的,一般網路編程有協議,我以前做醫學方面的,就有個DICOM協議
B. 停止等待協議用c語言怎麼實現
死循環會佔用CPU的資源
而等待一般都和系統有關,這涉及到系統編程,對硬體和操作系統不熟悉肯定是寫不出來的。
如果想知道去看看linux是如何實現的。
C. 通信協議的設計(c語言)
我和其他很多人以前分析過文曲星串口的協議
emsky.net上有文章,你去找找幾年前的帖子
D. linux c語言簡易通訊協議數據包的打包與解包
1、通訊協議數據包的話,前面放用來判斷這個包所做事情的功能碼,然後後面接數據所佔字元的長度,最後一段是要發送的數據,可以是數組也可以是結構體。
2、串口通信,每次只有一個位元組。如果數據量大,就要進行多位元組的傳送。這一批數據,應該有一個《頭》標記、目標機地址、數據長度、數據、校驗碼、尾標記等等。簡單的情況下,只有《頭》標記、數據,也可。
E. C語言協議書
協議書?
C語言還有協議書?沒聽說過..樓主是不是弄錯了?
F. 如何用C語言實現數據鏈路層的停止等待協議和ARQ協議
連續ARQ包括了回抄退N幀ARQ和選擇性重復ARQ這兩個協議,跟你前面提到的停止等待協議是一個目的,只是連續ARQ用了滑動窗口的概念可以令發送方一次性發送幾個連續的幀,加快網路傳輸的速率。首先,ARQ這些協議都是數據鏈路層的而TCP協議是傳輸層的,也就是說ARQ協議只能保證報文在一個鏈路上的傳輸是可靠的,而TCP則是保證報文在整個傳輸過程後得到的結果是可靠的。所以ARQ和TCP是兩個不同的協議,當然也不會是TCP協議的組成部分。
G. sip協議如何用C語言實現
樓上說的對,你可以先搜一下sip協議,了解一下,然後看看開源的osip的源代碼 不過照你說的,要學的這么深的話,那恐怕不是一朝一夕能搞定的,因為畢竟實現一個協議最起碼要一個團隊才行,不然那將horrible。。。。
H. http協議解析 請求行的信息怎麼提取 c語言源碼
實現步驟:
1)用Wireshark軟體抓包得到test.pcap文件
2)程序:分析pcap文件頭 -> 分析pcap_pkt頭 -> 分析幀頭 -> 分析ip頭 -> 分析tcp頭 -> 分析http信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<time.h>
#define BUFSIZE 10240
#define STRSIZE 1024
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;
//pacp文件頭結構體
struct pcap_file_header
{
bpf_u_int32 magic; /* 0xa1b2c3d4 */
u_short version_major; /* magjor Version 2 */
u_short version_minor; /* magjor Version 4 */
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
//時間戳
struct time_val
{
long tv_sec; /* seconds 含義同 time_t 對象的值 */
long tv_usec; /* and microseconds */
};
//pcap數據包頭結構體
struct pcap_pkthdr
{
struct time_val ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
//數據幀頭
typedef struct FramHeader_t
{ //Pcap捕獲的數據幀頭
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //幀類型
} FramHeader_t;
//IP數據報頭
typedef struct IPHeader_t
{ //IP數據報頭
u_int8 Ver_HLen; //版本+報頭長度
u_int8 TOS; //服務類型
u_int16 TotalLen; //總長度
u_int16 ID; //標識
u_int16 Flag_Segment; //標志+片偏移
u_int8 TTL; //生存周期
u_int8 Protocol; //協議類型
u_int16 Checksum; //頭部校驗和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
} IPHeader_t;
//TCP數據報頭
typedef struct TCPHeader_t
{ //TCP數據報頭
u_int16 SrcPort; //源埠
u_int16 DstPort; //目的埠
u_int32 SeqNO; //序號
u_int32 AckNO; //確認號
u_int8 HeaderLen; //數據報頭的長度(4 bit) + 保留(4 bit)
u_int8 Flags; //標識TCP不同的控制消息
u_int16 Window; //窗口大小
u_int16 Checksum; //校驗和
u_int16 UrgentPointer; //緊急指針
}TCPHeader_t;
//
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len); //查找 http 信息函數
//
int main()
{
struct pcap_file_header *file_header;
struct pcap_pkthdr *ptk_header;
IPHeader_t *ip_header;
TCPHeader_t *tcp_header;
FILE *fp, *output;
int pkt_offset, i=0;
int ip_len, http_len, ip_proto;
int src_port, dst_port, tcp_flags;
char buf[BUFSIZE], my_time[STRSIZE];
char src_ip[STRSIZE], dst_ip[STRSIZE];
char host[STRSIZE], uri[BUFSIZE];
//初始化
file_header = (struct pcap_file_header *)malloc(sizeof(struct pcap_file_header));
ptk_header = (struct pcap_pkthdr *)malloc(sizeof(struct pcap_pkthdr));
ip_header = (IPHeader_t *)malloc(sizeof(IPHeader_t));
tcp_header = (TCPHeader_t *)malloc(sizeof(TCPHeader_t));
memset(buf, 0, sizeof(buf));
//
if((fp = fopen(「test.pcap」,」r」)) == NULL)
{
printf(「error: can not open pcap file\n」);
exit(0);
}
if((output = fopen(「output.txt」,」w+」)) == NULL)
{
printf(「error: can not open output file\n」);
exit(0);
}
//開始讀數據包
pkt_offset = 24; //pcap文件頭結構 24個位元組
while(fseek(fp, pkt_offset, SEEK_SET) == 0) //遍歷數據包
{
i++;
//pcap_pkt_header 16 byte
if(fread(ptk_header, 16, 1, fp) != 1) //讀pcap數據包頭結構
{
printf(「\nread end of pcap file\n」);
break;
}
pkt_offset += 16 + ptk_header->caplen; //下一個數據包的偏移值
strftime(my_time, sizeof(my_time), 「%Y-%m-%d %T」, localtime(&(ptk_header->ts.tv_sec))); //獲取時間
// printf(「%d: %s\n」, i, my_time);
//數據幀頭 14位元組
fseek(fp, 14, SEEK_CUR); //忽略數據幀頭
//IP數據報頭 20位元組
if(fread(ip_header, sizeof(IPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
inet_ntop(AF_INET, (void *)&(ip_header->SrcIP), src_ip, 16);
inet_ntop(AF_INET, (void *)&(ip_header->DstIP), dst_ip, 16);
ip_proto = ip_header->Protocol;
ip_len = ip_header->TotalLen; //IP數據報總長度
// printf(「%d: src=%s\n」, i, src_ip);
if(ip_proto != 0×06) //判斷是否是 TCP 協議
{
continue;
}
//TCP頭 20位元組
if(fread(tcp_header, sizeof(TCPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
src_port = ntohs(tcp_header->SrcPort);
dst_port = ntohs(tcp_header->DstPort);
tcp_flags = tcp_header->Flags;
// printf(「%d: src=%x\n」, i, tcp_flags);
if(tcp_flags == 0×18) // (PSH, ACK) 3路握手成功後
{
if(dst_port == 80) // HTTP GET請求
{
http_len = ip_len – 40; //http 報文長度
match_http(fp, 「Host: 「, 「\r\n」, host, http_len); //查找 host 值
match_http(fp, 「GET 「, 「HTTP」, uri, http_len); //查找 uri 值
sprintf(buf, 「%d: %s src=%s:%d dst=%s:%d %s%s\r\n」, i, my_time, src_ip, src_port, dst_ip, dst_port, host, uri);
//printf(「%s」, buf);
if(fwrite(buf, strlen(buf), 1, output) != 1)
{
printf(「output file can not write」);
break;
}
}
}
} // end while
fclose(fp);
fclose(output);
return 0;
}
//查找 HTTP 信息
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len)
{
int i;
int http_offset;
int head_len, tail_len, val_len;
char head_tmp[STRSIZE], tail_tmp[STRSIZE];
//初始化
memset(head_tmp, 0, sizeof(head_tmp));
memset(tail_tmp, 0, sizeof(tail_tmp));
head_len = strlen(head_str);
tail_len = strlen(tail_str);
//查找 head_str
http_offset = ftell(fp); //記錄下HTTP報文初始文件偏移
while((head_tmp[0] = fgetc(fp)) != EOF) //逐個位元組遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, head_str);
exit(0);
}
if(head_tmp[0] == *head_str) //匹配到第一個字元
{
for(i=1; i<head_len; i++) //匹配 head_str 的其他字元
{
head_tmp[i]=fgetc(fp);
if(head_tmp[i] != *(head_str+i))
break;
}
if(i == head_len) //匹配 head_str 成功,停止遍歷
break;
}
}
// printf(「head_tmp=%s \n」, head_tmp);
//查找 tail_str
val_len = 0;
while((tail_tmp[0] = fgetc(fp)) != EOF) //遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, tail_str);
exit(0);
}
buf[val_len++] = tail_tmp[0]; //用buf 存儲 value 直到查找到 tail_str
if(tail_tmp[0] == *tail_str) //匹配到第一個字元
{
for(i=1; i<tail_len; i++) //匹配 head_str 的其他字元
{
tail_tmp[i]=fgetc(fp);
if(tail_tmp[i] != *(tail_str+i))
break;
}
if(i == tail_len) //匹配 head_str 成功,停止遍歷
{
buf[val_len-1] = 0; //清除多餘的一個字元
break;
}
}
}
// printf(「val=%s\n」, buf);
fseek(fp, http_offset, SEEK_SET); //將文件指針 回到初始偏移
}
I. 一加3所採用的type-c協議是怎樣的是否有技術解決兼容性問題
一加3的Typy-C介面支持標準的USB Type-C協議,兼容USB-Audio協議,可以輸出數字音頻信號。但要糾正一個觀念,按照標准設計,並不意味著所有Typy-C的功能都會支持,畢竟Type-C介面支持的功能太多了(有些功能手機也用不到的)。Type-C PD的功能,目前大部分的Type-C手機(如Nexus 6P)是都沒有支持的。
測試了下,一加3 Type-C介面支持的功能如下:
數據傳輸
Type-C 數據線充電
Type-C OTG轉接頭(需要在系統中開啟OTG功能)
Typy-C U盤直插(需要在系統中開啟OTG功能)
Type-C 耳機的數字音頻信號輸出(就是樂視鼓吹的數字信號輸出,一加3也支持,例如JBL Aware C降噪耳機)
Type-C 對外供電,配件需要支持Type-C的標准(例如JBL Aware C降噪耳機,需要C口供電實現主動降噪)
以上功能的標準的Type-C配件是都可以使用的,但一些非標準的轉接頭可能只能實現部分功能,例如只能實現普通充電、傳輸數據的功能,不支持OTG等。
關於提到的充電的問題,雖然官方建議是專線專充,但是強大的網友還是測試出一些其他適配器的充電情況:
使用普通適配器+普通數據線,只能普通充電(5V 2A,如果適配器支持的話)
使用VOOC適配器+一加3數據線,可以閃充。
使用VOOC適配器+普通Micro-USB數據線+標准C口轉接頭,只能普通充電。
使用VOOC適配器+OPPO閃充標配數據線+標准C口轉接頭,有可能閃充。(這事兒應該視轉接頭阻抗而定,阻抗低的可能會閃充,如阻抗過高,應該則只能普通充電。)