废话不多说直接上代码,最经典的客户端,服务端 实现方式:
服务端:
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionReguested ;
WSADATA wsaData ;
int err;
wVersionReguested = MAKEWORD( 1 ,1 );
err = WSAStartup(wVersionReguested ,&wsaData ) ;
if( err !=0 )
{
return 1;
}
if(LOBYTE(wsaData.wVersion )!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup() ;
return 1;
}
SOCKET sockSrv = socket(AF_INET ,SOCK_STREAM, 0) ;
SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(8000) ;
//绑定套接字
bind(sockSrv ,(SOCKADDR *)&addrSrv ,sizeof(SOCKADDR) );
listen(sockSrv,5) ;
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR) ;
while(1)
{
//等待客户请求的到来;
SOCKET sockConn = accept(sockSrv ,(SOCKADDR*)&addrClient ,&len );
char sendBuf[100];
sprintf(sendBuf,"welcom %s here !\n",inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn ,sendBuf ,strlen(sendBuf)+1,0) ;
char recvBuf[100];
recv(sockConn, recvBuf,100,0);
printf("recv: %s\n",recvBuf) ;
closesocket(sockConn) ;
}
return 0;
}
客户端代码:
#pragma comment(lib,"ws2_32.lib")
HMODULE ws2_base;
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested ;
pWSAStartup WSAStartupFunc;
psocket socketFunc;
pconnect connectFunc;
precv recvFunc;
psend sendFunc;
pclosesocket closesocketFunc;
pWSACleanup WSACleanupFunc;
pinet_addr inet_addrFunc;
phtons htonsFunc;
WSADATA wsaData ;
SOCKADDR_IN addrSrv;
int err;
ws2_base = LoadLibrary("WS2_32.dll");
socketFunc = (psocket)GetProcAddress(ws2_base,"socket");
connectFunc = (pconnect)GetProcAddress(ws2_base,"connect");
recvFunc = (precv)GetProcAddress(ws2_base,"recv");
sendFunc = (psend)GetProcAddress(ws2_base,"send");
closesocketFunc = (pclosesocket)GetProcAddress(ws2_base,"closesocket");
WSAStartupFunc = (pWSAStartup)GetProcAddress(ws2_base,"WSAStartup");
WSACleanupFunc = (pWSACleanup)GetProcAddress(ws2_base,"WSACleanup");
inet_addrFunc = (pinet_addr)GetProcAddress(ws2_base,"inet_addr");
htonsFunc = (phtons)GetProcAddress(ws2_base,"htons");
wVersionRequested = MAKEWORD( 1, 1) ;
err = WSAStartupFunc( wVersionRequested ,&wsaData );
if(err != 0)
{
return 1;
}
if ((int)WSAStartupFunc != (int)WSAStartup)
printf("error !!\n");
if(LOBYTE(wsaData.wVersion ) !=1 ||HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanupFunc();
return 1;
}
//创建套接字
SOCKET sockClient = socketFunc(AF_INET , SOCK_STREAM ,0) ;
addrSrv.sin_addr.S_un.S_addr = inet_addrFunc("127.0.0.1");
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htonsFunc(8000);
connectFunc(sockClient ,(SOCKADDR*)&addrSrv ,sizeof(SOCKADDR ));
//接收数据;
char recvBuf[100];
recvFunc(sockClient ,recvBuf,100,0) ;
printf("recv :%s",recvBuf) ;
sendFunc(sockClient ,"this is the client ",strlen("this is the client ") +1,0) ;
closesocketFunc(sockClient);
WSACleanupFunc ();
return 0;
}
结果客户端打印:
服务端打印:
客户端有些画蛇添足了,api不用 getproceaddress来着,直接调用就可以了。