Windows TCP 客戶端服務端

2021-10-07 04:54:36 字數 4577 閱讀 4087

服務端:socket->bind->listen->accept->recv/send->close

客戶端:socket-connect->send/recv->close

socket 函式

*網路位元組(network-byte)*

@轉換函式tcp socket程式設計

**:服務端

#include

#include

#include

using namespace std;

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

#pragma warning(disable : 4996)

intmain()

//2.申請服務端套接字

socket listingsocket;

listingsocket =

socket

(af_inet,sock_stream,ipproto_tcp)

;//sock_stream tcp屬於流形式的套接字

if(listingsocket == invalid_socket)

sockaddr_in serveraddr;

serveraddr.sin_family = af_inet;

//協議:internet協議

int port =

5150

; serveraddr.sin_port =

htons

(port)

;//埠(有6w多個埠,但是不能重複,選大一點的埠比較保險);同時要轉成(htons)網路使用的位元組序

serveraddr.sin_addr.s_un.s_addr =

htonl

(inaddr_any)

;//設定任何客戶端的ip都能連線;不限制客戶端的ip

if(socket_error ==

(bind

(listingsocket,

(sockaddr*

)&serveraddr,

sizeof

(serveraddr)))

)//4.開始監聽

if(socket_error ==

(listen

(listingsocket,5)

))//允許5個連線(佇列大小是5) 不要設定太大

cout <<

"we are wating for connecting on port:"

<< port << endl;

cout <<

"listen(正在監聽)"

<< endl;

//5有客戶端連線我們就接受客戶端連線

sockaddr_in clientaddr;

//客戶端位址

int clinetaddrlen =

sizeof

(sockaddr)

;//客戶端位址長度

socket newconnection;

//服務端接受成功會得到乙個客戶端的套接字,每乙個新的客戶端的套接字代表乙個新的連線

newconnection =

accept

(listingsocket,

(sockaddr*

)&clientaddr,

&clinetaddrlen);if

(newconnection == invalid_socket)

cout <<

"we successfully got a connection form ip: "

<<

inet_ntoa

(clientaddr.sin_addr)

<<

"; port:"

<<

ntohs

(clientaddr.sin_port)

<

//6.關閉套接字

closesocket

(listingsocket)

;//關閉套接字,這個例子只接受乙個客戶端連線

cout <<

"we are winting for receive data"

<< endl;

//接受資料

char databuffer[

1024];

//客戶端發來的東西放這裡面

if(socket_error ==

(ret =

recv

(newconnection, databuffer,

sizeof

(databuffer),0

))) cout <<

"we successfully recv :"

<< ret <<

"bytes"

<

//收到的buf都是字串 我們要把buf 的最後乙個位元組加上"\0";

databuffer[ret]

='\0'

; cout <<

"recv buf is"

<< databuffer <

//關閉客戶端的套接字做清理

closesocket

(newconnection)

;//關閉客戶端的套接字

wsacleanup()

;system

("pause");

return0;

}

客戶端

#include

#include

#include

using namespace std;

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

#pragma warning(disable : 4996)

intmain

(int argc,

char

** ar**)

wsadata wsadata;

int ret =0;

2.2版本的winsock;初始化widnows套接字

ret =

wsastartup

(makeword(2

,2),

&wsadata);if

(ret !=0)

//2.申請客戶端套接字

socket s;

s =socket

(af_inet, sock_stream, ipproto_tcp)

;//sock_stream tcp屬於流形式的套接字

if(s == invalid_socket)

//3.連線伺服器

sockaddr_in serveraddr;

serveraddr.sin_family = af_inet;

//協議:internet協議

int port =

5150

; serveraddr.sin_port =

htons

(port)

;//埠(有6w多個埠,但是不能重複,選大一點的埠比較保險);同時要轉成(htons)網路使用的位元組序

= inet_addr("127.0.0.1"); //設定服務端的位址(這裡就在本機測試)

serveraddr.sin_addr.s_un.s_addr =

inet_addr

(ar**[1]

);//設定服務端的位址(使用命令列來輸出)

cout <<

"we are try to connet :"

<<

inet_ntoa

(serveraddr.sin_addr)

<<

";port:"

<<

htons

(serveraddr.sin_port)

<

//4. 連線服務端

if(socket_error ==

(connect

(s,(sockaddr*

)&serveraddr,

sizeof

(serveraddr)))

) cout <<

"socket connnetion succeessed, we will send a message to server"

<< endl;

//5傳送資料if(

(ret =

send

(s,"****?",5

,0))

== socket_error )

cout <<

"we are successed send "

<< ret <<

"bytes to server"

<< endl;

//6 關閉套接字

closesocket

(s);

//關閉套接字

wsacleanup()

;system

("pause");

return0;

}

驗證圖:

windows tcp 客戶端 傳送檔案

include include include pragma comment lib,wsock32.lib char host name 192.168.58.128 local host int port 8000 int main int argc,char argv else char bu...

瘦客戶端 胖客戶端 智慧型客戶端

胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...

TCP通訊,多客戶端通訊(客戶端 服務端)

客戶端和伺服器間的交流,客戶端傳送資訊,伺服器接收到,並返回資訊 長連線建立socket連線服務端 指定ip位址,埠號 通過ip位址找對應的伺服器 呼叫socket的getinputstream 和getoutputstream 方法獲取和服務端相連的io流 輸入流可以讀取服務端輸出流寫出的資料 輸...