C++ネットワークプログラミング学習:基礎TCPサービス端/クライアントを確立する
ネットワークプログラミング学習レコードで使用される言語はC/C++ です.ソースコードでサポートされているプラットフォームは、Windows です.
笔记一:基础TCP服务端/クライアント 点我跳转笔记二:ネットワークデータメッセージの送受信 点我跳转笔记三:selectネットワークモデル 点我跳转笔记四:プラットフォームをまたいでWindowsをサポート、Linuxシステム 点我跳转笔记5:ソースコードのパッケージ 点我跳转笔记6:バッファオーバーフローと粘着包分包 点我跳转笔记7:サービス端マルチスレッド分离业务処理高负荷 点我跳转笔记
メモ1ネットワークプログラミング学習記録 一、簡易TCPサービス端末 を確立する 1.サービス側概略フロー の確立 2.コード実装および詳細注釈 二、簡易TCPクライアント を確立する 1.クライアント概略フロー を確立する 2.コード実装および詳細注釈 三、持続可能な処理要求を確立するネットワークプログラム 1.考え方 2.コード実装および詳細注釈 2.1サービス側コード 2.2クライアントコード
一、簡易TCPサービスを確立する
1.サービス側の大まかな流れを確立するソケット を確立するクライアント接続をバインドするポート(bind) リスニングネットワークポート(listen) クライアント接続受信待ち クライアントから送信データ(recv) を受信するクライアントにデータ送信(send) クローズソケット 2.コード実装および詳細なコメント
二、簡易TCPクライアントの確立
1.クライアントの概略フローの確立ソケット を確立する接続サーバ クライアントにデータ送信(send) クライアントから送信データ(recv) を受信するクローズソケット 2.コード実装および詳細なコメント
三、持続可能な処理要求のネットワークプログラムを確立する
1.考え方
socket接続後、すなわちサービス側がaccept操作、クライアントがconnect操作を行った後、ループを使用してsend/recv操作でデータを転送すると、持続的な処理要求を実現できます.
2.コード実装および詳細なコメント
2.1サービス側コード
2.2クライアントコード
笔记一:基础TCP服务端/クライアント 点我跳转笔记二:ネットワークデータメッセージの送受信 点我跳转笔记三:selectネットワークモデル 点我跳转笔记四:プラットフォームをまたいでWindowsをサポート、Linuxシステム 点我跳转笔记5:ソースコードのパッケージ 点我跳转笔记6:バッファオーバーフローと粘着包分包 点我跳转笔记7:サービス端マルチスレッド分离业务処理高负荷 点我跳转笔记
メモ1
一、簡易TCPサービスを確立する
1.サービス側の大まかな流れを確立する
#define WIN32_LEAN_AND_MEAN//
#include // windows.h ,
#include
#include
#pragma comment(lib,"ws2_32.lib")// windows
using namespace std;
int main()
{
// windows socket 2,x windows
WORD ver = MAKEWORD(2,2);//WinSock
WSADATA dat;// WSAStartup Socket
if(0 != WSAStartup(ver,&dat))// 0
{
return 0;
}
// socket
SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPV4 TCP
if(INVALID_SOCKET == _mysocket)//
{
return 0;
}
// IP
sockaddr_in _myaddr = {
};// sockaddr sockaddr_in
_myaddr.sin_family = AF_INET;//IPV4
_myaddr.sin_port = htons(8888);// host to net unsigned short
_myaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// INADDR_ANY
if(SOCKET_ERROR == bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in)))//socket ( )sockaddr
{
cout<<" "<<endl;
}
else
{
//cout<
}
//
if(SOCKET_ERROR == listen(_mysocket,5))//
{
cout<<" "<<endl;
}
else
{
//cout<
}
//
sockaddr_in _clientAddr = {
};// sockadd
int _addr_len = sizeof(sockaddr_in);// sockadd
SOCKET _temp_socket = INVALID_SOCKET;//
char _buf[256] = {
};//
while(true)
{
_temp_socket = accept(_mysocket,(sockaddr*)&_clientAddr,&_addr_len);//
if(INVALID_SOCKET == _temp_socket)//
{
cout<<" Socket"<<endl;
}
else
{
cout<<" "<<endl;
printf("IP :%s
", inet_ntoa(_clientAddr.sin_addr));
}
//
char _buf[256] = {
};
int _buf_len = recv(_temp_socket,_buf,256,0);
if(_buf_len>0)
{
printf("%s
",_buf);
}
//
char _msg[] = "HelloWorld";
send(_temp_socket,_msg,strlen(_msg)+1,0);// flag
// socket
closesocket(_temp_socket);
}
// socket
closesocket(_mysocket);
// windows socket
WSACleanup();
return 0;
}
二、簡易TCPクライアントの確立
1.クライアントの概略フローの確立
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")// windows
using namespace std;
int main()
{
// windows socket 2,x windows
WORD ver = MAKEWORD(2,2);//WinSock
WSADATA dat;// WSAStartup Socket
if(0 != WSAStartup(ver,&dat))// 0
{
return 0;
}
// socket
SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,0);//IPV4
if(INVALID_SOCKET == _mysocket)//
{
return 0;
}
//
sockaddr_in _sin = {
};//sockaddr
_sin.sin_family = AF_INET;//IPV4
_sin.sin_port = htons(8888);//
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// IP
if(SOCKET_ERROR == connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in)))
{
cout<<" "<<endl;
closesocket(_mysocket);
}
else
{
cout<<" "<<endl;
}
//
char _msg[] = "HelloServer";
send(_mysocket,_msg,strlen(_msg)+1,0);// flag
//
char _buf[256] = {
};
int _buf_len = recv(_mysocket,_buf,256,0);
if(_buf_len>0)
{
printf("%s
",_buf);
}
// socket
closesocket(_mysocket);
// windows socket
WSACleanup();
return 0;
}
三、持続可能な処理要求のネットワークプログラムを確立する
1.考え方
socket接続後、すなわちサービス側がaccept操作、クライアントがconnect操作を行った後、ループを使用してsend/recv操作でデータを転送すると、持続的な処理要求を実現できます.
2.コード実装および詳細なコメント
2.1サービス側コード
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")// windows
using namespace std;
int main()
{
// windows socket 2,x windows
WORD ver = MAKEWORD(2,2);//WinSock
WSADATA dat;// WSAStartup Socket
if(0 != WSAStartup(ver,&dat))// 0
{
return 0;
}
// socket
SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPV4 TCP
if(INVALID_SOCKET == _mysocket)//
{
return 0;
}
// IP
sockaddr_in _myaddr = {
};// sockaddr sockaddr_in
_myaddr.sin_family = AF_INET;//IPV4
_myaddr.sin_port = htons(8888);// host to net unsigned short
_myaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// INADDR_ANY
if(SOCKET_ERROR == bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in)))//socket ( )sockaddr
{
cout<<" "<<endl;
}
else
{
//cout<
}
//
if(SOCKET_ERROR == listen(_mysocket,5))//
{
cout<<" "<<endl;
}
else
{
//cout<
}
//
sockaddr_in _clientAddr = {
};// sockadd
int _addr_len = sizeof(sockaddr_in);// sockadd
SOCKET _temp_socket = INVALID_SOCKET;//
char _buf[256] = {
};//
_temp_socket = accept(_mysocket,(sockaddr*)&_clientAddr,&_addr_len);//
if(INVALID_SOCKET == _temp_socket)//
{
cout<<" Socket"<<endl;
}
else
{
cout<<" "<<endl;
printf("IP :%s
", inet_ntoa(_clientAddr.sin_addr));
}
while(true)//
{
//
int _buf_len = recv(_temp_socket,_buf,256,0);
if(_buf_len<=0)
{
printf("
");
break;
}
if(0 == strcmp(_buf,"getname"))
{
//
char _msg[] = "My name is Mr.Zhao";
send(_temp_socket,_msg,strlen(_msg)+1,0);// flag
}
else if(0 == strcmp(_buf,"getage"))
{
//
char _msg[] = "My age is 19";
send(_temp_socket,_msg,strlen(_msg)+1,0);// flag
}
else
{
//
char _msg[] = "???";
send(_temp_socket,_msg,strlen(_msg)+1,0);// flag
}
}
// socket
closesocket(_temp_socket);
// socket
closesocket(_mysocket);
// windows socket
WSACleanup();
printf(" , ");
getchar();
return 0;
}
2.2クライアントコード
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")// windows
using namespace std;
int main()
{
// windows socket 2,x windows
WORD ver = MAKEWORD(2,2);//WinSock
WSADATA dat;// WSAStartup Socket
if(0 != WSAStartup(ver,&dat))// 0
{
return 0;
}
// socket
SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,0);//IPV4
if(INVALID_SOCKET == _mysocket)//
{
return 0;
}
//
sockaddr_in _sin = {
};//sockaddr
_sin.sin_family = AF_INET;//IPV4
_sin.sin_port = htons(8888);//
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// IP
if(SOCKET_ERROR == connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in)))
{
cout<<" "<<endl;
closesocket(_mysocket);
}
else
{
cout<<" "<<endl;
}
while(true)//
{
//
char _msg[256] = {
};
scanf("%s",_msg);
//
if(0 == strcmp(_msg,"exit"))//
{
break;
}
else
{
//
send(_mysocket,_msg,strlen(_msg)+1,0);// flag
}
//
char _buf[256] = {
};
int _buf_len = recv(_mysocket,_buf,256,0);
if(_buf_len>0)
{
printf("%s
",_buf);
}
}
// socket
closesocket(_mysocket);
// windows socket
WSACleanup();
return 0;
}