Socket實現「回射客戶端 伺服器」功能

2021-08-13 16:05:15 字數 2945 閱讀 9142

tcp客戶/伺服器模型

伺服器端:

/*

回射客戶/伺服器應用程式

功能:客戶端輸入字元,傳送給伺服器,伺服器不對該字串做任何處理,又反回客戶端

*///伺服器端函式

#include#include#include#include#includeint main()

struct sockaddr_in servaddr; //ipv4的位址結構

memset(&servaddr,0,sizeof(servaddr));

// 初始化位址

servaddr.sin_family = af_inet; //位址的家族

servaddr.sin_port = htons(5188); //埠號,2個位元組,這裡需要的是網路位元組序(大端),需要將5188轉換為網路位元組序

servaddr.sin_addr.s_addr = htonl(inaddr_any); //設定位址,inaddr_any表示本地的任意位址

=inet_addr("127.0.0.1"); //顯示指定位址,inet_addr()將點分式位址轉換為10進製

// inet_aton("127.0.0.1",&servaddr.sin_addr);

//第二步為套接字繫結乙個本地位址

/* bind()

原型:int bind(int sockfd ,const struct sockaddr *addr, socklen_t);

引數: sockfd :socket()函式返回的套接字

addr: 要繫結的位址,(接受的為乙個通用位址,使用時可能需要強制型別轉換)

addrlen: 要繫結的位址長度,可以用sizeof()計算

返回值:成功返回0,失敗返回-1

*/ run=bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

if(run < 0)

//第三步:使套接字處於監聽狀態

/* listen()

包含標頭檔案;功能:使套接字從close狀態,設定為監聽狀態,轉換為監聽狀態才能接受連線

原型: int listen(int sockfd, int backlog);

引數:sockfd: socket()函式返回的套接字

backlog: 設定核心為此套接字排隊的最大連線個數

返回值:成功返回0,失敗返回-1

一般來說,listen函式應該在呼叫socket和bind函式之後,在呼叫accept函式之前,將套接字由主動變為被動套接字

對於給定的監聽套介面,核心要維護兩個佇列:

1.已由客戶發出並送達到伺服器,伺服器正在等待完成相應的tcp三次握手過程

2. 已完成連線的佇列

兩個佇列之和不超過backlog

*/ run = listen(listenfd,somaxconn);

if(run < 0)

struct sockaddr_in peeraddr; //定義對方的位址

socklen_t peerlen =sizeof(peeraddr); //定義對方的位址長度大小,注意需要有初始值,負責 accept()會失敗

int conn;

//第四步:從已完成連線佇列中返回第乙個連線,如果沒有連線過來一直處於阻塞狀態

/* 標頭檔案:功能: 從已完成連線佇列中返回第乙個連線,如果已完成隊列為空,則阻塞

原型: int accept(int sockfd , struct sockaddr * addr , socklen_t *addrlen);

引數: sockfd:伺服器套接字

addr :返回對等方的套接字位址

addrlen:返回對等方的套接字位址長度

返回值:成功返回非負正數(新得到的套接字,將這個套接字稱為已連線套接字),失敗返回-1

*/ conn = accept(listenfd,(struct sockaddr *)&peeraddr,&peerlen);

if(conn < 0)

char recvbuf[1024];

//實現回射通訊

while(1)

//關閉套介面

close(conn);

close(listenfd);

return 0;

}

客戶端:

#include#include#include#include#includeint main()

//設定連線位址

struct sockaddr_in client;

memset(&client,0,sizeof(client));

client.sin_family=af_inet;

client.sin_port=htons(5188);

client.sin_addr.s_addr =inet_addr("127.0.0.1");

//客戶端發起連線

error=connect(sock,(struct sockaddr *)&client,sizeof(client));

if(error<0)

char sendbuff[1024];

char recvbuff[1024];

while(fgets(sendbuff,sizeof(sendbuff),stdin)!=null )

//關閉套介面

close(sock);

return 0;

}

tcp 回射伺服器 客戶端非阻塞方式的實現

檔名 nonblock select.cpp 作用 使用select加上非阻塞的socket的伺服器端。tcpcli01.c include include include include include include include include include include include...

Socket實現HTTP客戶端

前些日子用 wininet做專案。功能忒強大了。但總覺得管理cookie有點不方便。即使設定了自己手動管理cookies。這天上掉餡餅的事還真的常常發生。比如你之前用瀏覽器訪問了這個站,留下了cookie 你再用wininet訪問的時候,這個餡餅就出現了。封包不難 連線後。將 headers一股腦堆...

socket 實現客戶端與服務端通訊

python內的socket已經預設實現了tcp和udp兩種傳輸協議。本文通過乙個簡單的例子記錄一下socket的簡單使用方法。實現 客戶端和服務端通過tcp協議通訊,客戶端向服務端傳送訊息,服務端接收訊息後新增 too 字串後返回給客戶端,客戶端可以主動斷開連線。服務端 import socket...