【摘要】 補充進程通信的知識點,介紹網(wǎng)絡編程基礎,完成服務器、客戶端創(chuàng)建,實現(xiàn)服務器與客戶端之間的基本通信。
任務1:進程
(1)?進程的創(chuàng)建和管理
(2)?命名管道與無名管道基本運用
(3)?信號的接收和發(fā)送(鬧鐘的信號)
#include
#include
/*信號處理函數(shù)*/
void sighandler(int signal_num)
{
alarm(1);
printf("SIGNAL:%d\n",signal_num);
}
int main(int argc,char **argv)
{
/*綁定信號到特定的函數(shù)*/
signal(SIGALRM,sighandler);
alarm(1); //設置鬧鐘
while(1)
{
}
return 0;
}
需求:通過C語言代碼獲取其他進程(c語言代碼、Shell腳本)的返回值。
(1)?system(“l(fā)s -l >123.txt”); //重定向輸出
(2)?popen標準管道;
#include FILE *popen(const char *command, const char *type); 參數(shù)解析: const char *command:就是需要執(zhí)行的命令,就是可執(zhí)行程序。例如: “l(fā)s -l” “./a.out” const char *type: “w”寫 “r”讀 int pclose(FILE *stream); |
無名管道:
fds[0] 表示讀
fds[1] 表示寫
int dup2(int oldfd, int newfd); //實現(xiàn)文件描述符的重定向
示例: dup2(fds[1],1); //將本程序的標準輸出定義到管道的寫端
標準輸入:0
標準輸出:1
標準錯誤:2
FIFO文件是否可以在創(chuàng)建? 不可在掛載的目錄下創(chuàng)建。
任務2:網(wǎng)絡編程
管道: 運用多個進程之間的通信。
socket網(wǎng)絡編程:運用于多個設備之間通信。
Socket網(wǎng)絡編程實際對TCP/IP協(xié)議進行編程。
TCP/IP協(xié)議:
底層協(xié)議:TCP\UDP
上層協(xié)議:HTTP、FTP、NFS……..
??學習網(wǎng)絡編程需要了解的概念:
1.?能夠傳輸網(wǎng)絡數(shù)據(jù)的方式: 以太網(wǎng)有線網(wǎng)卡、無線網(wǎng)卡WIFI
2.?了解網(wǎng)絡協(xié)議:如何區(qū)分數(shù)據(jù)是發(fā)給誰的。
3.?IP地址:同一個局域網(wǎng)內(nèi),每臺電腦的IP地址不一樣。
IP地址:區(qū)分每臺電腦。
4.?端口號:同一個電腦內(nèi),區(qū)分不同的應用程序。
192.168.1.18:8585
5. TCP協(xié)議:點對點協(xié)議(打電話),數(shù)據(jù)丟包會自動重發(fā),傳輸比較穩(wěn)定。
TCP協(xié)議有3次握手的過程,建立通信的基礎。
一般適用于:FTP文件傳輸、HTTP網(wǎng)頁數(shù)據(jù)傳輸?shù)鹊取?
TCP協(xié)議通信中區(qū)分服務器與客戶端:
服務器必須先存在,客戶端才可以連接。(網(wǎng)絡游戲)
客戶端與客戶端之間可以通信?必須通過服務器—模式就是(C/S)
5.?UDP協(xié)議:廣播方式協(xié)議(上課一樣)。
特性就是:實時性
一般適用于:視頻傳輸、視頻監(jiān)控…..QQ視頻
UDP協(xié)議不區(qū)分服務器與客戶端,發(fā)送數(shù)據(jù)的就是服務器,接收數(shù)據(jù)的就是客戶端。
6.?數(shù)據(jù)的大小端模式。電腦上的數(shù)據(jù)一般都是小端模式,網(wǎng)絡數(shù)據(jù)大端模式。
7.?Socket編程與文件操作原理是一樣。一切皆文件!
??TCP服務器創(chuàng)建流程
1.?調(diào)用socket函數(shù)創(chuàng)建網(wǎng)絡通信套接字(用法與open類似)。
2.?調(diào)用bind綁定端口的函數(shù)(填充必須要結構體成員),創(chuàng)建服務器。
3.?設置監(jiān)聽端口的數(shù)量(設置最大能夠連接的客戶端數(shù)量)
4.?調(diào)用accept等待
5.?調(diào)用read或者write函數(shù)進行基本通信
??TCP客戶端創(chuàng)建流程
1.?調(diào)用socket函數(shù)創(chuàng)建網(wǎng)絡通信套接字(用法與open類似)。
2.?調(diào)用Connect函數(shù)連接指定的服務器
3.?調(diào)用read或者write函數(shù)進行基本通信
?? 練習
1.?實現(xiàn)服務器與客戶端之間的基本通信,收發(fā)數(shù)據(jù)
客戶端:
#include
#include
#include
#include
#include
#include
/*
TCP服務器:
1. sockt創(chuàng)建套接字
2. bind綁定端口
3. 設置監(jiān)聽的數(shù)量
4. 等待客戶端連接
*/
int socket_sfd; /*保存了服務器端的套接字*/
int socket_cfd; /*已經(jīng)連接成功的客戶端套接字*/
int main(int argc,char **argv)
{
if(argc!=3)
{
printf("./server <192.168.xx.xx 本地IP地址> <服務器端口號>\n");
exit(-1);
}
int err; //存放返回值狀態(tài)
/*1. 創(chuàng)建套接字*/
socket_sfd=socket(AF_INET,SOCK_STREAM,0);
if(socket_sfd<0)
{
printf("服務器端創(chuàng)建失敗!\n");
exit(-1);
}
/*2. 綁定端口*/
struct sockaddr_in ServerAddr;
ServerAddr.sin_family=AF_INET; //IPV4協(xié)議
ServerAddr.sin_port=htons(atoi(argv[2])); //服務器的端口號 最大值65535
ServerAddr.sin_addr.s_addr=inet_addr(argv[1]); //IP地址賦值
err=bind(socket_sfd,(const struct sockaddr *)&ServerAddr,sizeof(struct sockaddr));
if(err!=0)
{
printf("服務器端 端口綁定失敗!\n");
exit(-1);
}
/*3. 設置監(jiān)聽的數(shù)量*/
listen(socket_sfd,10);
/*4. 等待客戶端連接*/
struct sockaddr_in ClientAddr; //存放已經(jīng)連接成功客戶端信息
socklen_t addrlen=sizeof(struct sockaddr); //客戶端的地址長度
socket_cfd=accept(socket_sfd,(struct sockaddr *)&ClientAddr,&addrlen);
if(socket_cfd<0)
{
printf("服務器端,連接客戶端失敗!\r\n");
exit(-1);
}
/*打印一些客戶端的信息*/
printf("成功連接的客戶端端口號:%d\n",ntohs(ClientAddr.sin_port));
printf("成功連接的客戶端IP地址:%s\n",inet_ntoa(ClientAddr.sin_addr));
/*5. 收發(fā)數(shù)據(jù) :服務器給客戶端發(fā)送10個字節(jié)的數(shù)據(jù)*/
err=write(socket_cfd,"123456789",10);
printf("服務器成功發(fā)送:%d 字節(jié)\r\n",err);
return 0;
}
2.?實現(xiàn)服務器與客戶端之間的文件傳輸。(單個文件傳輸)
-
通信
+關注
關注
18文章
5926瀏覽量
135695 -
網(wǎng)絡編程
+關注
關注
0文章
66瀏覽量
10048
發(fā)布評論請先 登錄
相關推薦
評論