1. 程式人生 > >TCP/IP網路程式設計1

TCP/IP網路程式設計1

最近筆試面試都考到了TCP/IP方面的知識,在日益發展的物聯網時代,網路通訊是必不可少的知識。自己對這方面的知識不夠深入,故查詢資料整理如下,如有侵權請聯絡。

概述     網路程式設計實際上就是編寫程式使兩臺聯網的計算機相互的交換資料。作業系統會提供名為“ 套接字 ”的部件。套接字是網路資料傳輸的軟體裝置,即使對網路資料傳輸原理不太熟悉也無關緊要。我們也能通過套接字完成資料傳輸,因此網路程式設計又叫套接字程式設計。 過程      我們可以把套接字理解為我們平時的電話機,我們先看一下套接字的建立過程:
  1. 首先你如果要和別人溝通肯定要安裝好電話機才可以,所以對應套接字的是呼叫socket函式時進行對話。
     #include<sys/socket.h>
     int socket(int domain,int type,int protocol)
   成功時返回檔案描述符,失敗時返回-1.

     2.  其次呼叫bind函式分配電話號碼進行對話,所以用到bind函式,實際上分配的是ip地址。

?
1 2 3 #include <sys/socket.h> int bind( int sockfd, struct sockaddr *myaddr,socklen_t addrlen) 成功時返回0,失敗返回-1
    3. 呼叫listen函式進行進行連線對話。
 int listen(int sockfd,int backlog)
 成功時返回0,失敗時返回-1.
   4.呼叫accept函式進行對話
int accept(int skckfd,struct sockaddr *addr,socklen_t *addrlen)
成功時返回檔案描述符,失敗時返回-1.
總結一下
  • 呼叫socket函式建立套接字,為通話準備條件。
  • 呼叫bind函式分配ip地址和埠,從而確定地址。
  • 呼叫listen函式轉為可接受請求狀態。
  • 呼叫accept函式受理連線請求。

程式碼實現(基於LINUX)

   編寫服務端程式碼,服務端是能夠受理連線請求的程式,該服務端收到連線請求之後向請求者返回"Hello!"。先不用關注語言細節,先把整個套接字程式設計的整個過程熟悉一遍。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 void Error_Handling(char *message);
 9 
10 int main(int argc,char *argv[])
11 {
12     int serverSocket;
13     int clientSocket;
14     struct sockaddr_in serverAddr;
15     struct sockaddr_in clientAddr;
16     socklen_t clientSocketAddrSize;
17     char message []="Hello!";
18     if(argc != 2)
19     {
20         printf("Usage:%s <port>\n",argv[0]);
21         exit(1);
22     }
23     serverSocket = socket(PF_INET,SOCK_STREAM,0);
24     if(serverSocket == -1)
25     {
26         Error_Handling("socket() error");
27     }
28     memset(&serverAddr,0,sizeof(serverAddr));
29     serverAddr.sin_family=AF_INET;
30     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
31     serverAddr.sin_port=htons(atoi(argv[1]));
32     if(bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr))==-1)
33     {
34         Error_Handling("bind() error");
35 
36     }
37     if(listen(serverSocket,5)==-1)
38     {
39         Error_Handling("listen() error");
40     }
41     clientSocketAddrSize = sizeof(clientAddr);
42     clientSocket = accept(serverSocket,(struct sockaddr*)&clientAddr,&clientSocketAddrSize);
43     if(clientSocket == -1)
44     {
45         Error_Handling("accept() error");
46 
47     }
48     write(clientSocket,message,sizeof(message));
49     close(clientSocket);
50     close(serverSocket);
51     return 0;
52 }
53 
54 void Error_Handling(char *message)
55 {
56     fputs(message,stderr);
57     fputc('\n',stderr);
58     exit(1);
59 }
套接字服務端程式

註解:

  • 第23行:呼叫socket函式建立套接字。
  • 第32行:呼叫bind函式分配IP地址和埠號
  • 第37行:呼叫listen函式套接字轉為可接受連結狀態。d
  • 第42行:呼叫accept函式受理請求連線。如果在沒有連線請求的情況系呼叫該函式,則不會返回,知道有連結請求為止。
  • 第48行:write函式用於傳輸資料。

構建打電話套接字(編寫客戶端程式碼)

  伺服器端建立的套接字又稱為伺服器套接字或監聽程式套接字。客戶端套接字的建立過程比伺服器端套接字簡單。

  請求連線的函式,因為其呼叫的是客戶端套接字。

  

#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
成功時返回0,失敗時返回-1.

客戶端套接字程式:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 #define MAXSIZE 30
 9 void Error_Handling(char* message);
10 
11 int main(int argc,char* argv[])
12 {
13     int sock;
14     struct  sockaddr_in serverAddr;
15     char message[MAXSIZE];
16     int str_len;
17     if(argc != 3)
18     {
19         printf("Usage : %s <IP> <Port> \n",argv[0]);
20         exit(1);
21     }
22     sock = socket(PF_INET,SOCK_STREAM,0);
23     if(sock == -1)
24     {
25         Error_Handling("sock() error");
26     }
27     memset(&serverAddr,0,sizeof(serverAddr));
28     serverAddr.sin_family=AF_INET;
29     serverAddr.sin_addr.s_addr=inet_addr(argv[1]);
30     serverAddr.sin_port=htons(atoi(argv[2]));
31     if(connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr))==-1)
32     {
33         Error_Handling("connect() error");
34     }
35 
36     str_len = read(sock,message,sizeof(message)-1);
37     if(str_len == -1)
38     {
39         Error_Handling("read error");
40     }
41     printf("Message from server : %s \n",message);
42     close(sock);
43     return 0;
44 }
45 
46 void Error_Handling(char *message)
47 {
48     fputs(message,stderr);
49     fputc('\n',stderr);
50     exit(1);
51 }
客戶端套接字程式

linux 平臺執行(我的環境時Debian 7)

此時服務端在等待請求,然後先開啟一個視窗並執行客戶端程式碼,然後如下圖所示

  1.在有些函式裡面成功時返回檔案描述符,其中檔案描述符也叫檔案控制代碼

檔案描述符 物件
0 標準輸入:Standard Input
1 標準輸出:Standard Output 
2 標準錯誤:Standard Error

要想了解具體程式碼含義,輕耐心等待下一篇部落格(套接字型別和協議設定)!

參考書籍:

    《Unix 網路程式設計》

    《TCP/IP 網路程式設計》