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 基於檔案型別的套接字家...