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...