转自:http://blog.csdn.net/thinkscape/article/details/4037476
注释参考:http://blog.163.com/163_dhbing/blog/static/117387803200942242433217/
Server:
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main()
{
//mide delete word
WORD wVersionRequested; //准备加载Winsock库的版本,注意高字节是副版本号
WSADATA wsaData; //是一个返回值,指向WSADATA结构的指针,WSAStartup函数将其加载的库版本信息输入到这个结构体中。
int err;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2)/*如果加载的版本不正确,返回。需要注意的是高字节是副版本号,低字节是主版本号*/
{
WSACleanup();
return ;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
/*socket(int af,int type,int protocol); //socket 函数三个参数af,指定地址族,对于TCP/IP协议套接字,它只能是AF_INET;type参数指定Socket类型,对于1.1版本的Socket,它只支持两种类型的套接字,SOCK_STREAM指定产生流失套接字,SOCK_DGRAM产生数据报套接字;protocol是与特定的地址家族相关的协议,如果指定为0,那么系统就会根据地址格式和套接字类别,自动选择一个合适的协议。*/
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));
/*s为指定要绑定的套接字;name指定了该套接字的本地地址信息,这是一个指向sockaddr结构的指针变量,该地址结构是为所有的地址家族准备的,这个结构可能随时用的网络协议不同而不同,所以才需要第三个参数namelen指定该地址结构的长度。*/
listen(sockSrv,5);
/*// int listen(SOCKET s,int backlog); s是Socket不用说,backlog是等待队列的最大长度,比如现在设为2,那么假如同时有3个请求来到服务器端的时候,就把前两个放到请求队列中,第三个就会被拒绝。*/
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/*//建立连接,返回对应于此次连接的SOCKET*/
char sendBuf[100];//发送数据的buff
sprintf(sendBuf,"welcome %s to my space",inet_ntoa(addrClient.sin_addr));//格式化客户端地址
send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送的字节多一个,最后一个是空,结束!
char recvBuf[100];//接收数据的buff
recv(sockConn,recvBuf,100,0);//接收数据
printf("%s/n",recvBuf);
closesocket(sockConn);//关闭连接
}
}
Client:
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main(){
//mide delete word
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.wHighVersion)!=2)
{
WSACleanup();
return ;
}
SOCKET sockClient=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(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s/n",recvBuf);
send(sockClient,"This is wangwu",strlen("This is wangwu")+1,0);
closesocket(sockClient);
WSACleanup();
}
注意:
server 和 client 都要"项目属性"--->"配置属性"----> "链接"----> "输入" --->"附加依赖项"中添加"ws2_32.lib"
(Leytton:若ws2_32.lib不行则加入WSOCK32.lib)