網路程式設計 1、TCP客戶端服務端的程式設計模型
阿新 • • 發佈:2019-02-20
- 客戶端呼叫虛列
- 呼叫socket函式建立套接字
- 呼叫connect連結直服務端
- 呼叫I/O函式(write/read)與伺服器進行通訊
- 呼叫close關閉套接字
//步驟一:建立socket int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { perror("sockert error"); exit(1); } struct sockaddr_in serveraddr; memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(atoi(argv[2])); //將ip地址轉換成網路位元組序 填入到serveraddr中 inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr); //步驟二:connect 連結到伺服器端; if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0) { perror("connect error"); exit(1); } //步驟三 呼叫I/O函式 //和伺服器斷進行雙向 通訊; char buffer[1024]; memset(buffer,0,sizeof(buffer)); size_t size; if((size=read(sockfd,buffer,sizeof(buffer)))<0) { perror("read error"); exit(1); } if(write(STDOUT_FILENO,buffer,size)!=size) { perror("write error"); } //步驟四 關閉套接字 close(sockfd);
- 伺服器端的呼叫序列
- 呼叫socket函式來建立套接字
- 呼叫bind函式繫結本地的地址和埠(family\port\ip);
- 呼叫listen()函式啟動監聽
- 呼叫accept函式從已經連線到佇列中 提取客戶連線
- 呼叫I/O函式與客戶端進行通訊
- 呼叫close關閉套接字
//步驟一:建立socket //建立在核心中;是一個結構體; //AF_INET:ipv4 //sock_stream :tcp 協議; sockfd=socket(AF_INET,SOCK_STREAM,0); //步驟二:將socket和地址繫結;包括(ip。port等) struct sockaddr_in serveraddr; memset(&serveraddr,0,sizeof(serveraddr) ); //往地址中填入ip port internet地址足型別等 serveraddr.sin_family=AF_INET;//ipv4; serveraddr.sin_port=htons(atoi(argv[1]));//port serveraddr.sin_addr.s_addr=INADDR_ANY;//"192.168.0.1";//監聽所有的網絡卡上面的客戶端的連結請求; if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0) { perror("bind error"); exit(1); } //步驟三 //呼叫listen 函式啟動監聽 制定port監聽; //通知系統去接受來自客戶端的連結請求; //及其昂接受到的客戶端請求放置到對應的佇列中 //第二個引數: 指定佇列的長度; if(listen(sockfd,10)<0) { perror("listen error"); exit(1); } //步驟四: //呼叫 accept函式從佇列之中獲得一個客戶端的請求連結 //並且返回一個新的socket 描述符;針對客戶端的; //如果沒有客戶端連結,呼叫這個函式會阻塞,直到獲得一個客戶端的連結; struct sockaddr_in clientaddr; socklen_t clientaddr_len=sizeof(clientaddr); while(1) { int fd=accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len); if(fd<0) { perror("accept error"); exit(1); } //步驟五:利用I/O函式(write/read) //和連結的客戶端進行雙向的通訊; out_addr(&clientaddr); do_service(fd); //步驟6 關閉socket; close(fd); }