【摘要】 介紹Linux網絡編程: TCP網絡編程、UDP網絡編程案例,完成數據互相發送。
任務1: 網頁視頻監控
1.?學習網絡編程
2.?USB攝像頭
3.?HTTP協議: 搭建HTTP服務器。
??網絡編程------TCP/IP協議編程----一套軟件協議----->數據結構。
??網絡編程底層協議: (從網絡收發一個字節)
1.?TCP協議(C/S): 點對點傳輸協議。數據傳輸可靠的。 適合傳輸大數據。
2.?UDP協議: 廣播方式傳輸協議 (對特定端口號進行廣播)。數據相對TCP不可靠的。---不適合傳輸大數據,傳輸小塊數據。
??網絡編程的上層協議:
1.?HTTP協議: 超文本傳輸協議----網絡使用。
2.?FTP協議: 文件傳輸協議---傳輸單文件。
3.?NFS協議: 文件傳輸協議----網絡文件系統。
??TCP協議編程:
1.?服務器: 等待客戶端連接。
2.?客戶端: 連接服務器。 QQ客戶端、xxx游戲客戶端。
網絡協議: 大端模式。
計算機IPV4的端口號范圍: 0~65535 。自己編寫的程序端口號: >1024
TCP服務器:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TCP服務器創建:
1. 創建socket套接字
2. 綁定端口號: 服務器創建
3. 設置監聽端口的數量: 服務器最大等待連接的客戶端總數量
4. 等待客戶端連接
*/
int main(int argc,char **argv)
{
/*1. 創建套接字*/
int server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd<0)
{
printf("TCP服務器:創建套接字創建失敗!\n");
return -1;
}
/*2. 綁定端口號*/
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET; //IPV4
server_addr.sin_port=htons(PORT); //需要填大端格式的端口號數據
server_addr.sin_addr.s_addr=0;//inet_addr("192.168.18.3");
/*0=inet_addr("0.0.0.0") ---表示本地所有IP地址*/
if(bind(server_fd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in))!=0)
{
printf("TCP服務器:綁定端口號失敗!\n");
return -2;
}
printf("struct sockaddr_in=%d\n",sizeof(struct sockaddr_in)); //16
printf("struct sockaddr=%d\n",sizeof(struct sockaddr)); //16
/*3. 設置監聽客戶端連接的數量*/
listen(server_fd,50);
/*4. 等待客戶端連接:阻塞*/
struct sockaddr_in client_addr;
int addrlen=sizeof(struct sockaddr_in);
int client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&addrlen);
if(client_fd<0)
{
printf("服務器提示:等待客戶端連接出現錯誤!\n");
return 0;
}
/*5. 數據的通信*/
char buff[]="1234567890";
int cnt=write(client_fd,buff,strlen(buff)+1);
printf("發送:%d,%s\n",cnt,buff);
/*6. 關閉服務器套接字*/
close(server_fd);
return 0;
}
TCP客戶端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TCP客戶端:
1. 創建socket套接字
2. 連接指定TCP服務器
*/
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("./app server_ip\n");
return 0;
}
/*1. 創建套接字*/
int client_fd=socket(AF_INET,SOCK_STREAM,0);
if(client_fd<0)
{
printf("TCP客戶端:創建套接字創建失敗!\n");
return -1;
}
/*2. 連接服務器*/
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET; //IPV4
server_addr.sin_port=htons(PORT); //需要填大端格式的端口號數據
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
if(connect(client_fd,(const struct sockaddr *)&server_addr,sizeof(struct sockaddr_in))!=0)
{
printf("連接服務器失敗!\n");
return -2;
}
/*3. 數據的通信*/
char buff[100];
int cnt=read(client_fd,buff,100);
printf("接收的數據:%d,%s\n",cnt,buff);
/*4. 關閉服務器套接字*/
close(client_fd);
return 0;
}
UDP接收端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
UDP服務器創建:
1. 創建socket套接字
2. 綁定端口號: 服務器創建
3. 等待接收數據
*/
int main(int argc,char **argv)
{
/*1. 創建套接字*/
int server_fd=socket(AF_INET,SOCK_DGRAM,0);
if(server_fd<0)
{
printf("UDP服務器:創建套接字創建失敗!\n");
return -1;
}
/*2. 綁定端口號*/
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET; //IPV4
server_addr.sin_port=htons(PORT); //需要填大端格式的端口號數據
server_addr.sin_addr.s_addr=0;//inet_addr("192.168.18.3");
/*0=inet_addr("0.0.0.0") ---表示本地所有IP地址*/
if(bind(server_fd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in))!=0)
{
printf("UDP服務器:綁定端口號失敗!\n");
return -2;
}
/*3. 等待數據接收*/
char buff[1024];
struct sockaddr_in client_addr;
int addrlen=sizeof(struct sockaddr_in);
int recv_len;
while(1)
{
//阻塞方式接收客戶端發來的數據
recv_len=recvfrom(server_fd,buff,1024,0,(struct sockaddr *)&client_addr,&addrlen);
printf("RX=%d,%s\n",recv_len,buff);
//printf();
}
/*4. 關閉服務器套接字*/
close(server_fd);
return 0;
}
UDP發送端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TDP客戶端:
1. 創建socket套接字
2. 向指定地址發送數據
*/
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("./app server_ip\n");
return 0;
}
/*1. 創建套接字*/
int client_fd=socket(AF_INET,SOCK_DGRAM,0);
if(client_fd<0)
{
printf("TCP客戶端:創建套接字創建失敗!\n");
return -1;
}
/*2. 向UDP服務器發送數據*/
char buff[]="1234567890";
int send_len;
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET; //IPV4
server_addr.sin_port=htons(PORT); //需要填大端格式的端口號數據
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
while(1)
{
//向服務器發送數據
send_len=sendto(client_fd,buff,strlen(buff)+1,0,(const struct sockaddr *)&server_addr,sizeof(struct sockaddr_in));
printf("TX:%d,%s\n",send_len,buff);
sleep(1);
}
/*3. 關閉客戶端套接字*/
close(client_fd);
return 0;
}
-
TCP
+關注
關注
8文章
1378瀏覽量
79304 -
UDP
+關注
關注
0文章
327瀏覽量
34045 -
網絡通信
+關注
關注
4文章
814瀏覽量
29948 -
網絡編程
+關注
關注
0文章
72瀏覽量
10101
發布評論請先 登錄
相關推薦
評論