1.C++網絡編程要用到ws2_32.lib這個動態鏈接庫,所以在程序運行前要添加動態鏈接庫。在VS中添加動態連接庫,右鍵項目解決方案,屬性,連接器,輸入,附加項,然後在開頭位置輸入ws2_32.lib;即可。
2.C++網絡編程,頭文件要包含sockwin2.h
3.C++網絡編程,可以使用面向連接的TCP協議,也可以使用面向無連接的UDP協議
首先是使用TCP協議的示例
(1)服務器端程序
#include<WinSock2.h>
#include<stdio.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//實現服務器端程序,接收客戶端的請求並做出響應//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
//以上部分用WSAStatrUp打開socket動態鏈接庫,可以查看MSDN中關於WSAStatrUp的解釋
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建SOCKET
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);//設置服務器的端口號
bind(sockSrv,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//將套接字與端口號進行綁定
listen(sockSrv,5);//監聽來自客戶端的請求
SOCKADDR_IN addrClient;//此地址用於保存客戶端的地址信息
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET socketConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//與客戶端建立連接
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to my world",inet_ntoa(addrClient.sin_addr));
send(socketConn,sendBuf,strlen(sendBuf)+1,0);//像客戶端發送歡迎信心
char recvBuf[100];
recv(socketConn,recvBuf,100,0);//接收客戶端的信息
printf("%s\n",recvBuf);
closesocket(socketConn);//關閉套接字
}
}
(2)客戶端程序
#include<WinSock2.h>
#include<stdio.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//客戶端程序,向服務器端發送請求//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//以上部分是初始化部分,打開SOCKET庫
SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);//設置要請求的服務器的地址及端口號
connect(socketClient,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//建立連接請求
char recvBuf[100];
recv(socketClient,recvBuf,100,0);//接收服務器的信息
printf("%s\n",recvBuf);
send(socketClient,"this is zhangsan",strlen("this is zhangsan")+1,0);//像服務器發送信息
closesocket(socketClient);//關閉套接字
WSACleanup();//關閉WSA
}
基於TCP的面向連接的協議是可靠的協議,與UDP相比有可靠的特點,但是消耗更多的網絡資源
基於UDP的面向無連接的協議將在下一篇文章中講述