一、有連接編程TCP
》》服務器編寫流程
1-創建套接字(socket)
2-服務綁定(bind)
3-服務偵聽(listen)
4-處理新連接(accept)
5-數據收發(recv/send)
6-套接字關閉(close)
》》客戶端編寫流程
1-客戶端套接字創建(socket)
2-發起連接(connect)
3-數據發收(send/recv)
4-套接字關閉(close)
server---------------------------------
//TCP 面向連接的編程
#include<iostream>
#include<windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")//靜態庫
void main()
{
////////////////////// WSAStartup 協商版本//////////////////////////
//該程序功能是讓程序能在Windows上面運行,使之和Linux之上運行一樣
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
/////////////////////////////
SOCKET sockSer;
sockSer=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSer,addrCli;
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(5050);
addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
bind(sockSer,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));
listen(sockSer,5);
SOCKET sockConn;
int len=sizeof(SOCKADDR);
cout<<"server waiting client connect..."<<endl;
sockConn=accept(sockSer,(SOCKADDR*)&addrCli,&len);
if(sockConn==INVALID_SOCKET)
{
cout<<"Server Accept client connect fail!"<<endl;
return;
}
else
{
cout<<"Server Accept client connect success!"<<endl;
}
char sendbuf[256];
char recvbuf[256];
while(1)
{
cout<<"Ser:>";
cin>>sendbuf;
if(strcmp(sendbuf,"quit")==0)
{
break;
}
send(sockConn,sendbuf,strlen(sendbuf)+1,0);
recv(sockConn,recvbuf,256,0);
cout<<"Cli:>"<<recvbuf<<endl;
}
closesocket(sockSer);
////////////
WSACleanup();
////////////之前加的WSAStartup在這塊要被clean 掉/
}
client----------------------------
#include<iostream>
#include<windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")//靜態庫
void main()
{
////////////////////// WSAStartup//////////////////////////
//該程序功能是讓程序能在Windows上面運行,使之和Linux之上運行一樣
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
///////////////////////////////////////////////////////////
SOCKET sockCli;
sockCli=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSer;
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(5050);
addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
int res=connect(sockCli,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));
if(res!=0)
{
cout<<"Client Connect server fail!"<<endl;
}
else
{
cout<<"client connect server success!"<<endl;
}
char sendbuf[256];
char recvbuf[256];
while(1)
{
recv(sockCli,recvbuf,256,0);
cout<<"Ser:>"<<recvbuf<<endl;
cout<<"Cli:>";
cin>>sendbuf;
if(strcmp(sendbuf,"quit")==0)
{
break;
}
send(sockCli,sendbuf,strlen(sendbuf)+1,0);
}
closesocket(sockCli);
///////////////////
WSACleanup();
////////////之前加的WSAStartup在這塊要被clean 掉/
}