本代碼可直接使用 根據TCP/IP三次握手,實驗時可使用兩台電腦,或者打開兩個終端模擬通信。
服務器端:
#include <iostream>
#include <windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib") //引用靜態鏈接庫
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err =WSAStarup( wVersionRequested,&wsaData);
if( err != 0).0
{
//tell the user that we could nto find a usable
//WinSock DLL;
return;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return;
}
//The WinSock DLL is acceptable,Proceed windows下版本的協商
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SOCKET sockSer;//服務器套接字
sockSer = socket(AF_INET,SOCK_STREAM,0);//創建套接字,AF_INET代表IP家族,0是默認的方式創建 有連接是流式 無連接是數據包套接字
SOCKADDR_IN addrSer,addrCli;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(5050);
addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.3.173");
bind(sockSer,(SOCKADDR)*&addrSer,sizeof(SOCKADDR));//綁定套接字 跟服務器的相關地址信息進行綁定
listen(sockSer,5);//監聽套接字 5是隊列大小
SOCKET sockConn;//給出一個相應的套接字
int len = sizeof(SOCKADDR);
cout<<"Server Wait Client Connect......."<<endl;
sockConn = accept(sockSer,(SOCKADDR*)&addrCli,&len);//處理新到連接 3個參數分別是服務器的套接字號;客戶端地址,相應地址層度的地址以地址形式傳遞
if(sockConn == INVALID_SOCKET);//INVALID_SOCKET非法套接字
{
cout<<"Server Accept Client Connect Fail"<<endl;
return;
}
else
{
cout<<"Server Accept Client Connect Success"<<endl;
return;
}
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);//發送服務器 +1為了字符串的/0 3個參數分別是要發送的套接字,緩沖,長度
recv(sockConn,recvbuf,256,0);//接收
cout<<"Cli:>"<<recvbuf<<endl;
}
closesocket(sockSer);//
WSACleanup();//清除版本信息
}
用戶端:
#include <iostream>
#include <windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err =WSAStarup( wVersionRequested,&wsaData);
if( err != 0)
{
//tell the user that we could nto find a usable
//WinSock DLL;
return;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return;
}
//The WinSock DLL is acceptable,Proceed windows下版本的協商
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SOCKET sockSli;//服務器套接字
sockSli = 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));//res為connect返回值 查閱相關函數,若為0則表示沒有錯誤
if (res != 0)
{
cout<<"Client Connect Servrer Fail!"<<endl;
return;
}
else
{
cout<<"Client Connect Servrer 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();
}
