网络编程Word文档下载推荐.docx
《网络编程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《网络编程Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
![网络编程Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/29/4090e516-a491-41e7-a66a-ef4beef8a1ff/4090e516-a491-41e7-a66a-ef4beef8a1ff1.gif)
}
};
voidusage(_TCHAR*name)//程序出现一部分错误时调用此函数,并返回
fprintf(stderr,"
usage:
%s[port]\n"
name);
}
int_tmain(intargc,_TCHAR*argv[])
SOCKETservsock,clisock;
//定义服务器和客户端的套接字
structsockaddr_insa;
//定义服务器的IP地址信息的结构体变量
structsockaddr_incliaddr;
//定义客户端的Ip地址信息的结构体变量
//结构体的定义如下:
//structsockaddr_in
//{
//shortsin_family;
//指一套地址族
//unsignedshortsin_port;
//指端口号
//structin_addrsin_addr;
//指IP地址
//charsin_zero[8];
//主要是使该结构的大小和SOCKADDR结构大小相同,
//}//这样做的目的是使地址操作更方mm,便
intlen;
//长度
interr;
//错误代号
intservport=5555;
//服务器端口
charbuff[256];
//缓冲区
SYSTEMTIMEst;
//定义系统时间变量
WSADATAwsd;
printf("
****************************************\n"
);
*timeserversample*\n"
map<
constchar*,int,ltstr>
scores;
//定义一个名为scores的map对象,由constchar*类型的键索引,关联的值则为int类型
//给map添加元素
//使用数组索引的形式插入数据
scores["
Tom"
]=80;
Mary"
]=90;
Peter"
]=87;
Rose"
]=85;
if(argc>
2)
usage(argv[0]);
return-1;
if(argc==2)
servport=_wtoi(argv[1]);
if(servport>
65535||servport<
1)
{
usage(argv[0]);
return-2;
}
if(WSAStartup(MAKEWORD(2,2),&
wsd)!
=0)
printf("
WSAStartup()failed!
\n"
return-3;
//初始化WinSock2.2WSAStartup函数的调用是为了加载WS2_32.lib库文件,
//只有当这个库被加载之后才能够使用一些通信的API函数。
//对windowssocketAPI进行初始化,只有在成功地完成调用之后才能使用socket。
//WSAStartup(MAKEWORD(2,2),&
wsd):
//第一个参数:
WORD类型,表示欲使用的windowssocketAPI版本,
//高位字节定义的是次版本号,低位字节定义的是主版本号
//第二个参数:
指向WSADATA资料的指针
//返回值:
成功返回
Creatingsocket...\n"
servsock=socket(AF_INET,SOCK_STREAM,0);
//函数原型:
SOCKETsocket(intaf,inttype,intproctocol)
//af指addressfamily(地址族)一般都填写AF_INET,表示是在Internet上的Socket;
//type是socket的类型,当采用流连接的方式时用SOCK_STREAM,用数据报文方式时用SOCK_DGRAM。
//proctocol一般都为,表示用对两种类型的socket分别采用缺省的TCP和UCP传输协议
//函数的返回值是由Winsock定义的一种数据类型SOCKET,
//它实际就是个整形数据在Socket创建成功时,代表Winsock分配给程序的Socket编号,
//后面调用传输函数时,就可以把它像文件指针一样引用。
如果创建失败,返回值是INVALID_SOCKET
if(servsock==INVALID_SOCKET)
fprintf(stderr,"
socket()failed:
%d\n"
WSAGetLastError());
return-4;
[0K]\n"
memset(&
sa,0,sizeof(sa));
sa.sin_family=AF_INET;
//填写服务器地址信息
sa.sin_port=htons(servport);
//servport为你需要绑定的端口,端口为5555
sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//将sockaddr_in结构中的sin_addr赋值为一个IP地址
//本句中指定通信对象为INADDR_ANY
//IP地址为INADDR_ANY(本机所有的IP地址,多IP的时候有区分)
//htonl()返回一个网络字节顺序的值。
//注意使用htonl()将一个位数从主机字节顺序转换成网络字节顺序。
//htons()将一个位数从主机字节顺序转换成网络字节顺序
//htons()返回一个网络字节顺序的值。
Bind...\n"
err=bind(servsock,(constsockaddr*)&
sa,sizeof(sa));
//服务器端口绑定(这样客户端才知道待会要连接哪个地址的哪一个端口)
//第一个参数为上面创建好的套接字
//第二个参数指向描述通信对象地址信息的结构体的指针(结构体指structsockaddr_in)
//第三个参数是该结构体的长度
if(err!
=0)
bind()failed:
return-5;
[OK]\n"
listen...\n"
err=listen(servsock,5);
//进入监听状态
intlisten(SOCKETs,intbacklog);
//第二个参数指等待连接的队列长度,可取-5
if(err!
listen()failed:
return-6;
[0k]\n"
//进入循环,等待客户连接请求
//进入While循环来等待要求通信的客户端的请求了,这就要用到accept函数,
//一旦accept函数检测到有连接请求,就要进行处理。
while
(1)
waitrequest...\n"
len=sizeof(cliaddr);
clisock=accept(servsock,(structsockaddr*)&
cliaddr,&
len);
//定义客户端套接字的对象,地址以及长度
//SOCKETaccept(SOCKETs,structsockaddr_in*addr,int*addrlen);
//接受连接请求
//当没有连接请求时,对于阻塞方式,就进入等待状态,直至有一个请求到达为止。
//在接收到请求之后,会为这个连接建立一个新的Socket来与对方通信,并把它作为返回值。
//新建的Socket与原来的Socket有相同的特性,包括端口号。
//原来的Socket被释放,用于继续等待其他的连接请求。
//而新生成的Socket才是与客户端进行通信的实际Socket。
//参数中的指针addr和addrlen用来返回客户机的sockaddr_in结构体,
//通过addr可得到客户机的IP地址和连接端口。
if(clisock==INVALID_SOCKET)
fprintf(stderr,"
accept()failed:
WSAGetLastError());
closesocket(servsock);
return-7;
acceptclient:
%s:
%d\n"
inet_ntoa(cliaddr.sin_addr),
ntohs(cliaddr.sin_port));
//打印客户端的地址,端口号。
注意的是:
函数inet_ntoa()的参数是structin_addr,而不是long。
//同时要注意的是他返回的是一个指向字符的指针。
//ntohs()将一个位数由网络字节顺序转换为主机字节顺序。
//ntohs()返回一个以主机字节顺序表达的数。
//ntohl()将一个位数由网络字节顺序转换为主机字节顺序。
//ntohl()返回一个以主机字节顺序表达的数。
GetLocalTime(&
st);
//获取系统时间
recvdata..\n"
memset(buff,0,sizeof(buff));
//用清空缓冲区,相当于缓冲区的初始化
if(recv(clisock,buff,sizeof(buff),0)==SOCKET_ERROR)
//接收套接字,并判定是否成功接收
recverror!
\