Linux Socket 函數庫是從 Berkeley 大學開發的 BSD UNIX 系統中移植過來的。BSD Socket 接口是在衆多 Unix 系統中被普遍支持的 TCP/IP 通訊接口,Linux 下的 Socket 程序設計,除了微小的差異以外,也適用於大多數其它 Unix 系統。編程
Socket 的使用,和文件操做比較相似。如同文件的讀、寫、打開、關閉等操做同樣,TCP/IP 網絡通訊一樣也有這些操做,不過它使用的接口不是文件描述符或者 FILE*,而是一個稱作 Socket 的描述符。相似於文件操做,對於 Socket,也經過讀、寫、打開、關閉操做來進行網絡數據傳送。同時,還有一些輔助的函數,如域名/IP 地址查詢、Socket 功能設置等。網絡
這星期的實驗是Socket編程實驗,我將本身的套在框架下寫的代碼分享出來。一份是TCP代碼,sender向receiver發送"hello",receiver將"hello"原封不動發回去,sender接收到"hello"後斷開鏈接,兩個服務同時down。第二份是UDP代碼,receiver監聽本身的端口,sender向receiver發送0-8的整數,receiver不會對收到了的信息做確認。發送完畢後sender down,receiver會繼續監聽。框架
閱讀接下來的代碼須要對Socket中的函數,Socket標誌符等概念十分清楚,其中一份TCP代碼通過了詳細的註釋。bind(),listen(),send()......這些Socket庫中的函數都須要讀者提早了解他們的功能。socket
放出一份TCP Receiver的代碼,其他的代碼在文末能夠下載。函數
1 #include <stdio.h> 2 #include <string.h> 3 //數據格式轉換 4 #include "net_exp.h" 5 #include <netinet/in.h> 6 7 main(){ 8 //TCP/IP中專用的用於監聽鏈接請求的本地地址 9 struct sockaddr_in client, server; 10 int s,ns,namelen,pktlen; 11 char buf[256]; 12 //定義套接字,返回值是Socket描述符 13 s = socket(AF_INET, SOCK_STREAM, 0); 14 //將指針當前位置後面的sizeof(server)個字節清0 15 memset((char*)&server, 0, sizeof(server)); 16 //Address family 17 server.sin_family = AF_INET; 18 //Port number,轉換成unsigned short int 19 server.sin_port = htons(TCP_SERVER_PORT); 20 server.sin_addr.s_addr = INADDR_ANY; 21 //給已經打開的socket指定本地地址,注意看,傳參數的時候有類型轉換 22 bind(s, (struct sockaddr*)&server, sizeof(server)); 23 //s-Socket描述符,backlog-鏈接請求暫存隊列長度, 24 //調用listen系統將給此Socket配備一個鏈接請求的隊列,暫存系統接收到的、申請向此Socket創建鏈接的請求。 25 listen(s, 1); 26 namelen = sizeof(client); 27 //accept:接受指定Socket上的鏈接請求,返回一個新的socket標識符,至關於建立了一個新的Socket用於傳輸數據, 28 //原來的Socket仍用來監聽請求。 29 ns = accept(s, (struct sockaddr*)&client, &namelen); 30 for(;;){ 31 //接收ns上受到的數據,存入buf 32 pktlen = recv(ns, buf, sizeof(buf), 0); 33 if(pktlen==0) 34 break; 35 printf("Received line:%s\n", buf); 36 //向發送方返回如出一轍的數據 37 send(ns, buf, pktlen, 0); 38 } 39 close(ns); 40 close(s); 41 }
想本身修改功能的話,修改源碼按照我最近寫的一個隨筆從新編譯便可。好比實現兩個終端或者兩個主機聊天。spa
源碼,可執行程序:https://files.cnblogs.com/files/chester-cs/Socket.zip設計