【摘要】 介紹Linux網(wǎng)絡(luò)編程: TCP網(wǎng)絡(luò)編程、UDP網(wǎng)絡(luò)編程案例,完成數(shù)據(jù)互相發(fā)送。
任務(wù)1: 網(wǎng)頁(yè)視頻監(jiān)控
1.?學(xué)習(xí)網(wǎng)絡(luò)編程
2.?USB攝像頭
3.?HTTP協(xié)議: 搭建HTTP服務(wù)器。
??網(wǎng)絡(luò)編程------TCP/IP協(xié)議編程----一套軟件協(xié)議----->數(shù)據(jù)結(jié)構(gòu)。
??網(wǎng)絡(luò)編程底層協(xié)議: (從網(wǎng)絡(luò)收發(fā)一個(gè)字節(jié))
1.?TCP協(xié)議(C/S): 點(diǎn)對(duì)點(diǎn)傳輸協(xié)議。數(shù)據(jù)傳輸可靠的。 適合傳輸大數(shù)據(jù)。
2.?UDP協(xié)議: 廣播方式傳輸協(xié)議 (對(duì)特定端口號(hào)進(jìn)行廣播)。數(shù)據(jù)相對(duì)TCP不可靠的。---不適合傳輸大數(shù)據(jù),傳輸小塊數(shù)據(jù)。
??網(wǎng)絡(luò)編程的上層協(xié)議:
1.?HTTP協(xié)議: 超文本傳輸協(xié)議----網(wǎng)絡(luò)使用。
2.?FTP協(xié)議: 文件傳輸協(xié)議---傳輸單文件。
3.?NFS協(xié)議: 文件傳輸協(xié)議----網(wǎng)絡(luò)文件系統(tǒng)。
??TCP協(xié)議編程:
1.?服務(wù)器: 等待客戶(hù)端連接。
2.?客戶(hù)端: 連接服務(wù)器。 QQ客戶(hù)端、xxx游戲客戶(hù)端。
網(wǎng)絡(luò)協(xié)議: 大端模式。
計(jì)算機(jī)IPV4的端口號(hào)范圍: 0~65535 。自己編寫(xiě)的程序端口號(hào): >1024
TCP服務(wù)器:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TCP服務(wù)器創(chuàng)建:
1. 創(chuàng)建socket套接字
2. 綁定端口號(hào): 服務(wù)器創(chuàng)建
3. 設(shè)置監(jiān)聽(tīng)端口的數(shù)量: 服務(wù)器最大等待連接的客戶(hù)端總數(shù)量
4. 等待客戶(hù)端連接
*/
int main(int argc,char **argv)
{
/*1. 創(chuàng)建套接字*/
int server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd<0)
{
printf("TCP服務(wù)器:創(chuàng)建套接字創(chuàng)建失敗!\n");
return -1;
}
/*2. 綁定端口號(hào)*/
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); //需要填大端格式的端口號(hào)數(shù)據(jù)
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服務(wù)器:綁定端口號(hào)失敗!\n");
return -2;
}
printf("struct sockaddr_in=%d\n",sizeof(struct sockaddr_in)); //16
printf("struct sockaddr=%d\n",sizeof(struct sockaddr)); //16
/*3. 設(shè)置監(jiān)聽(tīng)客戶(hù)端連接的數(shù)量*/
listen(server_fd,50);
/*4. 等待客戶(hù)端連接:阻塞*/
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("服務(wù)器提示:等待客戶(hù)端連接出現(xiàn)錯(cuò)誤!\n");
return 0;
}
/*5. 數(shù)據(jù)的通信*/
char buff[]="1234567890";
int cnt=write(client_fd,buff,strlen(buff)+1);
printf("發(fā)送:%d,%s\n",cnt,buff);
/*6. 關(guān)閉服務(wù)器套接字*/
close(server_fd);
return 0;
}
TCP客戶(hù)端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TCP客戶(hù)端:
1. 創(chuàng)建socket套接字
2. 連接指定TCP服務(wù)器
*/
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("./app server_ip\n");
return 0;
}
/*1. 創(chuàng)建套接字*/
int client_fd=socket(AF_INET,SOCK_STREAM,0);
if(client_fd<0)
{
printf("TCP客戶(hù)端:創(chuàng)建套接字創(chuàng)建失敗!\n");
return -1;
}
/*2. 連接服務(wù)器*/
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); //需要填大端格式的端口號(hào)數(shù)據(jù)
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("連接服務(wù)器失敗!\n");
return -2;
}
/*3. 數(shù)據(jù)的通信*/
char buff[100];
int cnt=read(client_fd,buff,100);
printf("接收的數(shù)據(jù):%d,%s\n",cnt,buff);
/*4. 關(guān)閉服務(wù)器套接字*/
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服務(wù)器創(chuàng)建:
1. 創(chuàng)建socket套接字
2. 綁定端口號(hào): 服務(wù)器創(chuàng)建
3. 等待接收數(shù)據(jù)
*/
int main(int argc,char **argv)
{
/*1. 創(chuàng)建套接字*/
int server_fd=socket(AF_INET,SOCK_DGRAM,0);
if(server_fd<0)
{
printf("UDP服務(wù)器:創(chuàng)建套接字創(chuàng)建失敗!\n");
return -1;
}
/*2. 綁定端口號(hào)*/
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); //需要填大端格式的端口號(hào)數(shù)據(jù)
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服務(wù)器:綁定端口號(hào)失敗!\n");
return -2;
}
/*3. 等待數(shù)據(jù)接收*/
char buff[1024];
struct sockaddr_in client_addr;
int addrlen=sizeof(struct sockaddr_in);
int recv_len;
while(1)
{
//阻塞方式接收客戶(hù)端發(fā)來(lái)的數(shù)據(jù)
recv_len=recvfrom(server_fd,buff,1024,0,(struct sockaddr *)&client_addr,&addrlen);
printf("RX=%d,%s\n",recv_len,buff);
//printf();
}
/*4. 關(guān)閉服務(wù)器套接字*/
close(server_fd);
return 0;
}
UDP發(fā)送端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include /* superset of previous */
#define PORT 1234
/*
TDP客戶(hù)端:
1. 創(chuàng)建socket套接字
2. 向指定地址發(fā)送數(shù)據(jù)
*/
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("./app server_ip\n");
return 0;
}
/*1. 創(chuàng)建套接字*/
int client_fd=socket(AF_INET,SOCK_DGRAM,0);
if(client_fd<0)
{
printf("TCP客戶(hù)端:創(chuàng)建套接字創(chuàng)建失敗!\n");
return -1;
}
/*2. 向UDP服務(wù)器發(fā)送數(shù)據(jù)*/
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); //需要填大端格式的端口號(hào)數(shù)據(jù)
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
while(1)
{
//向服務(wù)器發(fā)送數(shù)據(jù)
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. 關(guān)閉客戶(hù)端套接字*/
close(client_fd);
return 0;
}
-
TCP
+關(guān)注
關(guān)注
8文章
1337瀏覽量
78863 -
UDP
+關(guān)注
關(guān)注
0文章
318瀏覽量
33832 -
網(wǎng)絡(luò)通信
+關(guān)注
關(guān)注
4文章
774瀏覽量
29728 -
網(wǎng)絡(luò)編程
+關(guān)注
關(guān)注
0文章
66瀏覽量
10048
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論