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