socket 學習筆記 TCP

2021-08-28 11:15:56 字數 3220 閱讀 3895

tcp通訊的基本思路是服務端監聽乙個埠,然後客戶端連線這個埠(三次握手),建立連線後連線的資訊儲存在套接字(socket)中,使用send和recv進行資料的傳輸,因為tcp底層實現有錯誤校驗,所以對比udp方式傳輸穩定性,準確性較好,同時速度也較慢。

#include 

#ifdef win32

//windows下使用的標頭檔案

#include

//引用靜態庫

#pragma comment

(lib,

"ws2_32.lib"

)#else

//linux下的標頭檔案

#include

#include

#endif // win32

//執行緒函式

dword

winapi

threadfunc

(void

* param)

printf

("recv: %s\n"

, szrecvbuf)

;

char szsendbuf[

1024];

sprintf_s

(szsendbuf,

"hello client!");

//像客戶端傳送資料

send

(connsocket, szsendbuf,

strlen

(szsendbuf)+1

,0);

//關閉連線

closesocket

(connsocket)

;return0;

} int main()

//繫結監聽位址和埠

sockaddr_in addrserv;

addrserv.sin_family =

af_inet

;//表示使用ipv4

addrserv.sin_addr.s_un.s_addr =

htonl

(inaddr_any);

//表示監聽本機所有網絡卡的ip位址

addrserv.sin_port =

htons

(6666);

//監聽6666埠if(

bind

(s,(

sockaddr*)

&addrserv,

sizeof

(sockaddr))

==socket_error

)//開始監聽if(

listen

(s,5))

printf

("服務端初始化完成!等待連線...\n");

//等待連線

sockaddr_in clientaddr;

//用來儲存連線上來的客戶端的資訊

int nlen =

sizeof

(sockaddr);

while

(true

)}

#include 

#ifdef win32

//windows下使用的標頭檔案

#include

//引用靜態庫

#pragma comment

(lib,

"ws2_32.lib"

)#else

//linux下的標頭檔案

#include

#include

#endif // win32

int main()

//設定服務端的位址和埠

sockaddr_in addrserv;

addrserv.sin_family =

af_inet

;//表示使用ipv4

addrserv.sin_addr.s_un.s_addr =

inet_addr

("127.0.0.1");

//服務端位址

addrserv.sin_port =

htons

(6666);

//連線6666埠

//連線if(

connect

(s,(

sockaddr*)

&addrserv,

sizeof

(sockaddr))

==socket_error)

char szbuf[

1024];

sprintf_s

(szbuf,

"hello server!");

//傳送

send

(s, szbuf,

strlen

(szbuf)+1

,0);

memset

(szbuf,0,

1024);

//接收

int nrecv =

recv

(s, szbuf,

1024,0

);printf

("recv: %s\n"

, szbuf)

;closesocket

(s);

return0;

}

tcp協議很多語言都支援,不是c++寫的客戶端也能連

例如python:

#!

/usr/bin/python3

# 檔名:client.py

# 匯入 socket、sys 模組

import socket

import sys

# 建立 socket 物件

s = socket.

socket

(socket.

af_inet

, socket.

sock_stream

) # 連線服務,指定主機和埠

s.connect((

"127.0.0.1"

,6666))

msg =

"hello server!"

s.send

(msg.

encode

("gbk"))

# 接收小於 1024 位元組的資料

msg = s.

recv

(1024)s.

close()

print

(msg.

decode

('gbk'

))

Socket學習筆記

public classsocketextends object 此類實現客戶端套接字 也可以就叫 套接字 套接字是兩台機器之間的通訊端點。套接字的實際工作由socketimpl類的例項執行。應用程式通過更改建立套接字實現的套接字工廠可以配置它自身,以建立適合本地防火牆的套接字。一 建構函式 soc...

socket學習筆記

為了理清思路,做一些小筆記 1 socket流程 int socket 產生了該socket的描述符socket description bind 主動呼叫時,把socket與埠繫結,如果不主動呼叫,在linsten和connect時,會自動隨機分配乙個埠。server端在socket和bind之後...

Socket學習筆記

插板插座 網路套接字 在通訊過程中,套接字一定是成對存在的 兩份套接字,c乙個 s乙個 乙個檔案描述符指向乙個套接字 該套接字內部由核心借助兩個緩衝區實現 網路位元組序 大端法 例如udp段格式,位址0 1是16位的源埠號,如果這個埠號是1000 0x3e8 則位址0是0x03,位址1是0xe8,也...