网络编程.docx
- 文档编号:2452643
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:30
- 大小:25.85KB
网络编程.docx
《网络编程.docx》由会员分享,可在线阅读,更多相关《网络编程.docx(30页珍藏版)》请在冰豆网上搜索。
网络编程
/**********************查找姓名******************************************/
/////////////////////////////////Server////////////////////////////////////////////////////
#include"stdafx.h"
#include"winsock2.h"
#include"stdlib.h"
#include
#include
usingnamespacestd;
#definePROTOPORT5188
#defineQLEN6
//使用函数对象ltstr,输出set容器中A和B的并集
//定义字符串比较函数对象ltstr
structltstr
{
booloperator()(constchar*s1,constchar*s2)const
{
returnstrcmp(s1,s2)<0;
}
};
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");
printf("*timeserversample*\n");
printf("****************************************\n");
map
//定义一个名为scores的map对象,由constchar*类型的键索引,关联的值则为int类型
//给map添加元素
//使用数组索引的形式插入数据
scores["Tom"]=80;
scores["Mary"]=90;
scores["Peter"]=87;
scores["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资料的指针
//返回值:
成功返回
printf("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;
}
printf("[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()返回一个网络字节顺序的值。
printf("Bind...\n");
err=bind(servsock,(constsockaddr*)&sa,sizeof(sa));
//服务器端口绑定(这样客户端才知道待会要连接哪个地址的哪一个端口)
//第一个参数为上面创建好的套接字
//第二个参数指向描述通信对象地址信息的结构体的指针(结构体指structsockaddr_in)
//第三个参数是该结构体的长度
if(err!
=0)
{
fprintf(stderr,"bind()failed:
%d\n",WSAGetLastError());
return-5;
}
printf("[OK]\n");
printf("listen...\n");
err=listen(servsock,5);
//进入监听状态
//函数原型:
intlisten(SOCKETs,intbacklog);
//第二个参数指等待连接的队列长度,可取-5
if(err!
=0)
{
fprintf(stderr,"listen()failed:
%d\n",WSAGetLastError());
return-6;
}
printf("[0k]\n");
//进入循环,等待客户连接请求
//进入While循环来等待要求通信的客户端的请求了,这就要用到accept函数,
//一旦accept函数检测到有连接请求,就要进行处理。
while
(1)
{
printf("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:
%d\n",WSAGetLastError());
closesocket(servsock);
return-7;
}
printf("acceptclient:
%s:
%d\n",inet_ntoa(cliaddr.sin_addr),
ntohs(cliaddr.sin_port));
//打印客户端的地址,端口号。
注意的是:
函数inet_ntoa()的参数是structin_addr,而不是long。
//同时要注意的是他返回的是一个指向字符的指针。
//ntohs()将一个位数由网络字节顺序转换为主机字节顺序。
//ntohs()返回一个以主机字节顺序表达的数。
//ntohl()将一个位数由网络字节顺序转换为主机字节顺序。
//ntohl()返回一个以主机字节顺序表达的数。
GetLocalTime(&st);//获取系统时间
printf("recvdata..\n");
memset(buff,0,sizeof(buff));//用清空缓冲区,相当于缓冲区的初始化
if(recv(clisock,buff,sizeof(buff),0)==SOCKET_ERROR)
//接收套接字,并判定是否成功接收
{
fprintf(stderr,"recverror!
\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程