网络编程Word文档下载推荐.docx

上传人:b****1 文档编号:15369600 上传时间:2022-10-29 格式:DOCX 页数:30 大小:25.85KB
下载 相关 举报
网络编程Word文档下载推荐.docx_第1页
第1页 / 共30页
网络编程Word文档下载推荐.docx_第2页
第2页 / 共30页
网络编程Word文档下载推荐.docx_第3页
第3页 / 共30页
网络编程Word文档下载推荐.docx_第4页
第4页 / 共30页
网络编程Word文档下载推荐.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

网络编程Word文档下载推荐.docx

《网络编程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《网络编程Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。

网络编程Word文档下载推荐.docx

}

};

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!

\

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1