不管是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型別的乙個物件,我們需要將該物件的幾種賦值與建立封裝到類...