========================================================
網(wǎng)絡(luò)編程
========================================================
1,網(wǎng)絡(luò)通信:
操作系統(tǒng)進(jìn)程間的通信UNIX BSD:管道(pipe)、有名管道、信號(hào)(signal)
UNIX system V: 消息(message)、共享存取區(qū)(shared memory)、信號(hào)量(semaphore)
他們都只能進(jìn)行進(jìn)程間的通信,因此網(wǎng)間的通信使用的是TCP/IP網(wǎng)絡(luò)協(xié)議,最常用的
編程接口是: UNIX BSD(套接字)SOcket、UNIX SYstem V的TLI(已經(jīng)淘汰)
即SOcket---->套接字
2,TCP/IP、UDP協(xié)議
TCP/IP:傳輸控制協(xié)議,為廣域網(wǎng)而設(shè)計(jì)的。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、宿豫網(wǎng)站維護(hù)、網(wǎng)站推廣。
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是屬于TCP/IP協(xié)議族中的一種。如圖:
TCP/IP協(xié)議存在于OS中,網(wǎng)絡(luò)服務(wù)通過OS提供,在OS中增加支持TCP/IP的系統(tǒng)調(diào)用——Berkeley套接字,如Socket,Connect,Send,Recv等
TCP/IP協(xié)議族包括運(yùn)輸層、網(wǎng)絡(luò)層、鏈路層,而socket所在位置如圖,Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層。
物理結(jié)構(gòu):應(yīng)用層---->運(yùn)輸層----->網(wǎng)絡(luò)層----->鏈路層(一般四層),細(xì)分為:七層結(jié)構(gòu)
SOcket: 是應(yīng)用層和運(yùn)輸層間通信的抽象層
3,SOcket:
1)服務(wù)器:先初始化SOcket----->端口綁定(bind)----->對(duì)端口進(jìn)行監(jiān)聽(listen)---->調(diào)用accept組 塞------>等待客戶連接
2)客戶端:初始化SOcket------->連接服務(wù)器(connect)---->連接成功則通信開始(客戶端發(fā)送數(shù)據(jù)請(qǐng) 求,服務(wù)器接受請(qǐng)求并處理請(qǐng)求;回發(fā)數(shù)據(jù)給客戶端,客戶端讀取數(shù)據(jù),關(guān)閉連接)初始化
SOcket: int socket() 返回socketfd(描述符)
bind: int bind() 進(jìn)行客戶端ip的綁定(IP地址+端口號(hào))
網(wǎng)絡(luò)字節(jié)序:小端模式(低字節(jié)在高位)綁定時(shí)必須進(jìn)行字節(jié)序轉(zhuǎn)化
listen: 監(jiān)聽socket listen(int socktefd, int backlog); backlog: socket最大連接個(gè)數(shù)
connect: connect(int sockfd, const struct sockaddr *add, socklen_t addrlen) : 第二個(gè)參數(shù)是服務(wù)器的ip地址
4,socket創(chuàng)建TCP經(jīng)過三次握手:請(qǐng)求--->應(yīng)答---->確認(rèn)
TCP接收終止:四次握手釋放
sercer.c:
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc ,char **argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr, caddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = INADDR_ANY;
/************定端口號(hào)和IP***/
if(bind(sockfd, (struct sockaddr *)&saddr,sizeof(struct sockaddr)) == -1)
printf("bind is error\n");
/************監(jiān)聽**************/
if(listen(sockfd, 5) == -1)
printf("listen is error\n");
printf("LINE : %d\n", __LINE__);
int size = sizeof(struct sockaddr);
/************接受連接請(qǐng)求**************/
printf("connet\n");
int newsockfd = accept(sockfd, (struct sockaddr *)&caddr, &size);
if(newsockfd == -1)
printf("accept is error\n");
printf("connet\n");
close(sockfd);
close(newsockfd);
return 0;
}
client.c:
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char**argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr, caddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[2]));
saddr.sin_addr.s_addr = inet_addr(argv[1]);
/************定端口號(hào)和IP***/
printf("LINE : %d\n", __LINE__);
int size = sizeof(struct sockaddr);
/************接受連接請(qǐng)求**************/
int ret = connect(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));
if(ret == -1)
printf("accept is error\n");
perror("connet");
close(sockfd);
return 0;
}
------------------------------------------------------------完成:2015年4月13日