封裝socket整理

2021-10-06 16:19:49 字數 3787 閱讀 7041

不管是socket通訊程式的客戶端還是服務端,準備工作的**較長,影響了主程式的簡潔性,不過可以分離出來,追求簡單實用。

用c語言封裝

c語言只能把程式封裝成函式。

測試:客戶端

int connectclient(const char *severip,const int port);

#include #include #include #include #include #include #include int main()

char buffer[1024];

while(1)

printf("iret=%d,傳送成功:%s\n",iret,buffer);

memset(buffer,0,sizeof(buffer));

if ( (iret=recv(sockfd,buffer,sizeof(buffer),0))<=0)

printf("iret=%d,接收成功:%s\n",iret,buffer);

}close(sockfd);

return 0;

}int connectclient(const char *severip,const int port)

struct sockaddr_in servaddr;

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

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(port);

memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);

if (connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)

return sockfd;

}

服務端封裝:

#include #include #include #include #include #include #include #include #include #include #include #include int connectclient(int port);

int main()

printf("ret=%d,接收成功:%s\n",iret,buffer);

if(strcmp(buffer,"bye")==0) break;

memset(buffer,0,sizeof(buffer));

printf("請輸入您要傳送的內容:");

scanf("%s",buffer);

if ( (iret=send(clientfd,buffer,strlen(buffer),0))<=0) // 向客戶端傳送響應結果。

printf("iret=%d,傳送成功:%s\n",iret,buffer);

}close(listenfd); close(clientfd);

}int connectclient(int port)

struct sockaddr_in servaddr; // 服務端位址資訊的資料結構。

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

servaddr.sin_family = af_inet; // 協議族,在socket程式設計中只能是af_inet。

servaddr.sin_addr.s_addr = htonl(inaddr_any); // 任意ip位址。

= inet_addr("172.19.8.95"); //指定ip位址。

servaddr.sin_port = htons(port); //指定通訊埠

if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 )

// 第3步:把socket設定為監聽模式。

if (listen(listenfd,5) != 0 )

return listenfd;

}

經過測試,互動成功。

用c++封裝

客戶端:  

#include #include #include #include #include #include #include // tcp客戶端類

class ctcpclient;

int main()

char strbuffer[1024];

for (int ii=0;ii<5;ii++) }

ctcpclient::ctcpclient()

ctcpclient::~ctcpclient()

// 向伺服器發起連線,serverip-服務端ip,port通訊埠

bool ctcpclient::connecttoserver(const char *serverip,const int port)

// 把伺服器的位址和埠轉換為資料結構

struct sockaddr_in servaddr;

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

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(port);

memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);

// 向伺服器發起連線請求

if (connect(m_sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))!=0)

return true;}

int ctcpclient::send(const void *buf,const int buflen)

int ctcpclient::recv(void *buf,const int buflen)

服務端;

#include #include #include #include #include #include #include class ctcpserver; 

int main()

if (tcpserver.accept() == false)

printf("客戶端已連線。\n");

char strbuffer[1024];

while (1)

printf("客戶端已斷開連線。\n");}

ctcpserver::ctcpserver()

ctcpserver::~ctcpserver()

// 初始化服務端的socket,port為通訊埠

bool ctcpserver::initserver(int port)

// 把socket設定為監聽模式

if (listen(m_listenfd,5) != 0 )

return true;}

bool ctcpserver::accept()

int ctcpserver::send(const void *buf,const int buflen)

int ctcpserver::recv(void *buf,const int buflen)

經過測試出現乙個問題:

以雲伺服器作為服務端,虛擬機器作為客戶端,是可以連線成功並且通訊的,

在虛擬機器之間作為客戶端或者服務端,可以連線成功並且可以通訊。

以虛擬機器作為服務端,雲伺服器作為客戶端,連線不成功。

socket函式 整理

include int connect int sockfd,const struct sockaddr server addr,socklen t addrlen 為了理解connect函式,我們需要對connect函式的功能進行介紹。connect函式的功能可以用一句話來概括,就是完成面向連線的...

socket程式設計整理

udp和tcp的對比 簡單點說。udp處理的細節比tcp少。udp不能保證訊息被傳送到 它也報告訊息沒有傳送到 目的地。udp也不保證資料報的傳送順序。udp把資料發出去後只能希望它能夠抵達目的地。tcp優缺點 優點 1 tcp提供以認可的方式顯式地建立和終止連線。2 tcp保證可靠的 順序的 資料...

Linux元件封裝 八 Socket的封裝

我們要封裝socket,首先我們需要了解socket需要哪些要素 1 首先,乙個套接字建立後,需要繫結一塊網絡卡的ip,以及連線的對口號,所以我們先封裝inetaddr。在class中,僅有的乙個私有成員就是struct sockaddr in型別的乙個物件,我們需要將該物件的幾種賦值與建立封裝到類...