TCP伺服器與客戶端的實現

2021-09-26 21:54:30 字數 2082 閱讀 5445

在實現tcp伺服器之前,我們需要了解一下網路程式設計中基礎的幾個概念。

套接字

要實現網路上兩台主機之間的資訊傳輸,就像茫茫人海中兩個人見面約會一樣。第一步是要幹什麼呢?當然是要認出對方才是你要找的人,不然認錯了人跟陌生人約會,那可就麻煩大了。對於我們人類來說,熟人可以通過相貌、穿著等判斷,而如果你要去見乙個素未謀面只知道他的名字的陌生人,那該怎麼判斷ta是不是你要找的人呢?最穩妥的辦法當然是——身份證!而套接字就起到了主機的身份證的作用。

tcp協議下套接字由ip位址和埠兩部分組成,在客戶端連線主機端時,需要客戶端的套接字與主機端的ip位址和埠相匹配才能完成連線,這也就保證了連線的準確性。

定址方式

定址方式從字面意義上理解,就是搜尋位址的方式。在網路程式設計中即搜尋連線物件位址的方式。例如tcp協議中利用ip+埠確定通訊雙方,但是如果換做其他協議就不一定使用該種方式了。因此,為了區分不同的網路協議,我們最好是使用統一的定址方式。

位元組順序

在socket套接字程式設計中,資料的排列順序分為網路位元組順序與主機位元組順序兩種,其中網路位元組順序是大端儲存,即將最重要的位元組優先進行儲存,而主機位元組順序則是根據主機情況而定,x86cpu通常是小端儲存,即將最不重要的位元組優先儲存。

至於為什麼要將位元組順序分為網路位元組序和主機位元組序也非常好理解。由於不同主機上位元組序可能不一樣,如果直接不改變位元組序直接傳送資料,可能造成接收方的資料損壞。因此定下乙個統一的標準,傳送資料時統一將資料轉換為網路位元組序,這樣接收方接收到後再轉換為自己的主機位元組序,就避免了資料的損壞。

**如下:

#define _winsock_deprecated_no_warnings

#include#include#include#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()

if (getchar())

else

}::wsacleanup();

return 0;

}

**如下:

#define _winsock_deprecated_no_warnings

#include#include#include#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() ;//用於接收資訊的字串

::wsastartup(wversionrequested, &data);

s1 = ::socket(af_inet, sock_stream, 0);

addr1.sin_family = af_inet;

addr1.sin_port = htons(75);

addr1.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");

printf("client start!\r\n");

int isstart=::connect(s1, (sockaddr*)& addr1, sizeof(addr1));

int error=wsagetlasterror();

::recv(s1, sztext, sizeof(sztext), 0);

printf("%s", sztext);

::closesocket(s1);

::wsacleanup();

if (getchar())

return 0;

else

}

編寫完畢後我們首先執行伺服器程式,再執行客戶端程式。要注意順序錯誤的話會導致連線不上,如何做乙個無關順序的伺服器等改天再說。

圖左邊是執行客戶端的效果圖,右邊是伺服器。

在使用套接字之前必須先用wsastart()來進行初始化,我在實現客戶端的時候漏掉了這一句,導致連線失敗,用wsagetlasterror抓到的錯誤是10069.

TCP伺服器與客戶端的建立

基於tcp 伺服器 1.建立乙個socket,用函式socket 2.繫結ip位址 埠等資訊到socket上,用函式bind 3.設定允許的最大連線數,用函式listen 4.接收客戶端上來的連線,用函式accept 5.收發資料,用函式send 和recv 或者read 和write 6.關閉網路...

TCP伺服器 客戶端程式

server tcpserver.cpp檔案 include common initsock.h include cinitsock initsock 初始化winsock庫 int main 填充sockaddr in結構 sockaddr in sin sin.sin family af ine...

TCP主機客戶端與Linux伺服器

1.關閉雙方防火牆 service iptables stop 2.檢視雙方ip位址 l ifconfig w ipconfig 3.雙方 ping linux可適當重新整理橋接 客戶端 1.設立通訊關鍵字 qtcpsocket 2.主動鏈結 connecttohost ip,埠 3.傳送訊息 qt...