一:端口linux
1:網絡傳送數據的時,按照端口來進行數據包分類; 1):端口的取值範圍在[1, 65535]; 2):[1, 1023]系統保留端口; 3):[1024,5000] BSD臨時端口; 用戶使用 4):[5001-65535], BSD服務器(非特權)端口; 用戶使用windows
2:哪一個數據包屬於哪一個端口的,根據端口分類; 1):因此應用程序經過網絡收發數據的時候,必定會對應一個端口; 3:查看端口占用: 1) netstat -ano 觀察被佔用的端口 2)ESTABLISHED狀態: 表示創建了鏈接正在通信; 3)CLOSE_WAIT狀態: 對方已經關閉,你也要關閉你的socket; 4)TIME_WAIT: 我方主動調用close()斷開鏈接,收到對方確認後狀態變爲TIME_WAIT服務器
二:Win socket網絡
1: windows socket 編譯庫文件與頭文件: #include<winsock2.h> #include <windows.h> #pragma comment(lib, "WSOCK32.LIB")socket
2: windows 開始運行的時候指定socket 的版本: WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2) WSAStartup(wVersionRequested, &wsaData);接口
3:結束後清理下: WSACleanup(); 4: linux下面不須要作這樣的事情,大部分的socket接口,linux與windows兼容, windows會有本身的 相關擴展。ip
三:服務器監聽socketio
1: 建立一個socket,指明是TCP 的socket; int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);編譯
2: bind ip地址與端口cli
struct sockaddr_in sockaddr; s
ockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
int ret = bind(s, (const struct sockaddr*)&sockaddr, sizeof(sockaddr));
3:監聽端口: ret = listen(s, 1); // 將socket做爲監聽端口;
4: 接入一個客戶端:
struct sockaddr_in c_address;
int address_len = sizeof(c_address);
client_fd = accept(s, (struct sockaddr*)&c_address, &address_len);
printf("new client comming...! %s:%d\n", inet_ntoa(c_address.sin_addr), ntohs(c_address.sin_port));
5: recv/send 數據 6: closesocket: 關閉socket,斷開鏈接;
四:客戶端鏈接服務器
1: 建立一個TCP socket: int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2: 配置鏈接ip地址:
struct sockaddr_in sockaddr;
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(6000);
3: 鏈接到特定的服務器:
int ret = connect(s, ((struct sockaddr*) &sockaddr), sizeof(sockaddr));
4: recv/send 收發數據;
6: closesocket: 關閉socket;
7:客戶端本身也會分配一個沒有被佔用的端口和服務器鏈接,不必定是服務器的端口;
五:關閉socket
1: 根據TCP協議定義的3次握手斷開鏈接規定,發起socket主動關閉的一方 socket將進入TIME_WAIT狀態,TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime),在Windows下默認爲4分鐘,即240秒,TIME_WAIT狀態下的socket不能被回收使用. 具體現象是對於一個處理大量短鏈接的服務器,若是是由服務器主動關閉客戶端的鏈接,將致使服務器端存在大量的處於TIME_WAIT狀態的socket, 甚至比處於Established狀態下的socket多的多,嚴重影響服務器的處理能力,甚至耗盡可用的socket,中止服務. TIME_WAIT是TCP協議用以保證被從新分配的socket不會受到以前殘留的延遲重發報文影響的機制,是必要的邏輯保證.
2:收到關閉消息的時候,立刻關閉掉對應的socket。