socket實現TCP通訊

2021-07-27 08:41:06 字數 3050 閱讀 1652

tcp是一種可靠的,面向連線的協議。

在socket中,建立tcp連線的過程大致如下:

伺服器端:

1.初始化套接字

2.建立伺服器socket

3.將本機位址與伺服器socket繫結在一起

4.伺服器開始監聽

5.伺服器確認請求(確認之前時一種阻塞的狀態),accept()函式生成乙個新的socket。

6.用新生成的socket接收資料

客戶端:

1.初始化套接字

2.生成與伺服器連線的socket

3.將socket與伺服器進行連線

4.向伺服器傳送資料

1.socket socket(int 位址族,int 套接字型別,int 協議型別),返回生成的socket

2.int bind(socket 要繫結的套接字,const sockaddr* 要繫結的位址的結構體的指標,int 第二個引數的長度)

將套接字繫結到指定的網路位址上,一般在connect()或listen()函式前呼叫。

在伺服器端,用作監聽客戶端連線請求的套接字一定要經過繫結。

在客戶端使用的套接字一般不必繫結,除非要指定它使用特定的網路位址。

3. int listen(socket 要監聽的套接字,int 最大允許等待連線長度)

適用於支援連線的套接字。僅用於伺服器。

4.socket accept(socket 監聽套接字,sockaddr* 客戶端的位址結構,int* 客戶端位址長度)

accept函式將從listen的等待佇列中抽取出乙個項,建立tcp連線,返回乙個已經經過了連線的新的套接字。

若佇列中沒有連線請求,當:

阻塞方式時,該函式阻塞呼叫它的程序。

非阻塞方式時,該函式返回乙個錯誤**。

5.int connect(socket s,const sockaddr* 伺服器端位址結構,int 伺服器端位址長度)

用於客戶端請求向伺服器端建立連線。

6.int recv(socket 已建立連線的套接字,char* 接收字串的緩衝區,int 緩衝區長度,int 選項一般為0)

返回實際接收的位元組數

7.int send(socket 已建立連線的套接字,char* 傳送字串的緩衝區,int 緩衝區長度,int 選項一般為0)

返回實際傳送的位元組數

源**如下:

伺服器端:

#include "stdafx.h"

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

#include #define bufsize 64

int main()

sserver = socket(af_inet, sock_stream, ipproto_tcp);

if (sserver == invalid_socket)

sockaddr_in addrserv;

addrserv.sin_family = af_inet;

addrserv.sin_port = htons(9000);

addrserv.sin_addr.s_un.s_addr = htonl(inaddr_any);//inaddr_any是ip位址0.0.0.0,表示來自任意ip位址的請求均接收

retval = bind(sserver, (sockaddr*)&addrserv, sizeof(sockaddr_in));

if (retval == socket_error)

retval = listen(sserver, 1);

if (retval == socket_error)

printf("tcp server start...\n");//至此,伺服器啟動完成

sockaddr_in clientaddr;

int addrlen;

addrlen = sizeof(clientaddr);

sclient = accept(sserver, (sockaddr*)&clientaddr, &addrlen);

//阻塞狀態

if (sclient == invalid_socket)

printf("client has log in\n");//開啟客戶端時,顯示客戶已登入

while (true)

printf("ip: %s\nport: %d\ncontent: %s\n", inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port, recvbuf);

} return 0;

}

客戶端:

#include "stdafx.h"

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

#define bufsize 64

int main()

shost = socket(af_inet, sock_stream, ipproto_tcp);

if (shost == invalid_socket)

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_un.s_addr = inet_addr("10.21.38.14");//伺服器ip位址;

servaddr.sin_port = htons(9000);

int addrlen;

addrlen = sizeof(servaddr);

retval = connect(shost, (sockaddr*)&servaddr, addrlen);

if (retval == socket_error)

while (1) }

return 0;

}

例如:

Tcp通訊 Socket)初學

第一次接觸socket的時候覺得挺好玩的,在閒暇之餘寫下了這個第乙個socket專案 使用於初學著 不喜勿噴 客戶端 suppresswarnings resource public static void main string args throws exception in.close 根據節...

基於TCP的Socket通訊

在win32平台上的winsock程式設計都要經過下列步驟 定義變數 獲得windock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放資源 1 建立乙個socket,用函式socket int socket int domain,int t...

基於tcp的socket通訊

socekt是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它 把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議 socket 基於檔案型別的套接字家...