




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TCP/UDP通信编程入门(C+)1.TCP与UDP连接模式的比较TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议.UDP:User Datagram Protocol 用户数据报协议(UDP)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.有关这两种模式如果你想了解更多的话,看这儿 :/v20113.htm?syn=TCP /v33638.htm a) .TCP Server创建流程: WSAStartup(.)-socket(.)-bind(.)-listen(.)-accept(.)-recv(.)-closesocket(.)- WSACleanup(); TCP Client创建流程: WSAStartup(.)-socket(.)-bind(.)-connect(.)-send(.)-closesocket(.)- WSACleanup();b).UDP Server创建流程: WSAStartup(.)-socket(.)-bind(.)-recvfrom(.)-closesocket(.)-WSACleanup(); UDP Client创建流程: WSAStartup(.)-socket(.)-sendto(.)-closesocket(.)-WSACleanup();上面的不用记,等下面的函数讲解完,函数理解了,也就自然串起来了。函数解析:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData );本函数初始化winsock库EG:WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);/MAKEWORD将前面的2和后面的2组成一个新的WORD,生成一个版本号。MAKEWORD(a,b),a=2,1;b=1,0;都可以。当然你用0x101,0x200,0x202也没错。SOCKET socket( int af, int type, int protocol ); 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET; 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM; 第三个参数指定应用程序所使用的通信协议。 如果协议protocol未指定(等于0),则使用缺省的连接方式。(这个通常设置为0)。EG:socket(AF_INET,SOCK_STREAM,0);int bind( SOCKET s, const struct sockaddr FAR* name,int namelen); sockaddr结构定义如下:struct sockaddr u_short sa_family; char sa_data14; ;在使用这个函数之前,必须要对结构体sockaddr_in的结构变量初始化。struct sockaddr_in short int sin_family; /* Address family */ unsigned short int sin_port; /* Port number */ struct in_addr sin_addr; /* Internet address */ unsigned char sin_zero8; /* Same size as struct sockaddr */ /这个不用管,只是为了使结构体与sockaddr_in结构体长度匹配. ; 这儿因为要绑定主机,所以必须用结构体sockaddr_in的结构变量记录主机信息。然后再强制类型转换成sockaddr类型。EG:sockaddr_in mycomputerinfo;mycomputerinfo.sin_family=AF_INET;mycomputerinfo.sin_port=htons(端口号) /服务端端口,这里要用htons函数将端口从本地字节序转换为网络字节序才能使用。具体参见/view/569197.htmmycomputerinfo.sin_addr.s_addr=inet_addr(IP); /服务端IP地址。对IP的初始化还有另外一种方式。具体记不清了,自己查阅一下吧。inet_addr(.)函数将字符串转换为32位整数。因为我们输入的IP地址是字符串,所以要转换的。int listen( SOCKET s, int backlog); /这个函数没什么要讲的。最后一个参数是等待连接队列的最大长度。SOCKET accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen); 这个函数用于服务端,进行通信连接用的。注意喽,这儿是个重点。对于TCP连接来说,有两个套接字,一个监听套接字,一个会话套接字。 在这个函数之前使用的套接字为监听套接字,在这个函数及之后使用的套接字则为会话套接字。 再讲讲这两个套接字的运行过程,我们首先是定义了一个监听套接字使用函数 listen(.)去监听来自客户端的连接请求,当我们的监听套接字接收到连接请求,把连接请求传递给会话套接字,然后再从消息队列中取出下一条消息,如果没有消息的话,则处于等待状态。而accept(.)函数接收到连接请求后,则会建立起服务端与客户端的连接,为后面的通信做准备。我这么说,你应该明白吧,很简单的。 int connect( SOCKET s, const struct sockaddr FAR* name, int namelen); 这个函数用于客户端,进行通信连接用的。int recv( SOCKET s, char FAR* buf, int len, int flags); /该函数用于服务端。s:一个标识已连接套接口的描述字。 buf:用于接收数据的缓冲区。 len:缓冲区长度。 flags:指定调用方式int send( SOCKET s, const char FAR* buf, int len, int flags); /该函数用于服务端。s:一个标识已连接套接口的描述字。 buf:包含待发送数据的缓冲区。 len:缓冲区长度。 flags:调用执行方式。int sendto( SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen); /该函数用于客户端。s:一个标识套接口的描述字。 buf:包含待发送数据的缓冲区。 len:buf缓冲区中数据的长度。 flags:调用方式标志位。 to:(可选)指针,指向目的套接口的地址。 tolen:to所指地址的长度。 int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen); /该函数用于客户端。s:标识一个已连接套接口的描述字。 buf:接收数据缓冲区。 len:缓冲区长度。 flags:调用操作方式。 from:(可选)指针,指向装有源地址的缓冲区。 fromlen:(可选)指针,指向from缓冲区长度值。 int closesocket( SOCKET s);/关闭套接字。int WSACleanup ( void );/中止Windows Sockets DLL的使用。OK!到现在为止,12个函数全部讲解完。 我想对于怎样建立UDP及TCP连接你应该理解了吧。我们这就进入实践阶段,呵呵。2.写一个简单的控制台通信程序。(以下代码均在winxp,VC6.0环境下测试通过)基于TCP协议的控制台通信程序/服务端#include#include /如果想要使用winsock2的函数,就改为winsock2.h#pragma comment(lib,ws2_32) /*这条预处理语句与你在 工程-设置-连接 里输入库名的效果是一样的。2选1就行。*/void main() SOCKET jianting; /监听套接字 SOCKET huihua; /会话套接字 sockaddr_in mycomputerinfo; sockaddr_in elsecomputerinfo; /服务端及客户端的地址信息 int len=sizeof(sockaddr); char recvbuf128; char sendbuf128; /定义缓冲区 mycomputerinfo.sin_family=AF_INET; mycomputerinfo.sin_port=htons(2000); /*服务主机端口,端口最好在1024以上,服务器端必须指定端口,客户端可指定也可不指定,该成员赋值为0表示自动分配端口。*/ mycomputerinfo.sin_addr.s_addr=INADDR_ANY; /服务主机地址,该宏指代本机IP. WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws); jianting=socket(AF_INET,SOCK_STREAM,0); /*这里以及后面函数的使用你可以加入异常处理代码。这里为方便起见,就不写出来了。*/ bind(jianting,(sockaddr*)&mycomputerinfo,len); listen(jianting,5); huihua=accept(jianting,(sockaddr*)&elsecomputerinfo,&len); /通过一个无限循环保持服务端与客户端间的通信 while(true) recv(huihua,recvbuf,128,0); char *str=inet_ntoa(elsecomputerinfo.sin_addr); printf(%s 说:%sn,str,recvbuf); gets(sendbuf); send(huihua,sendbuf,strlen(sendbuf)+1,0); closesocket(jianting); closesocket(huihua); WSACleanup();/客户端#include#include#pragma comment(lib,ws2_32) void main() /会话套接字 SOCKET huihua; int jiancelink; sockaddr_in mycomputerinfo; sockaddr_in elsecomputerinfo; /服务端地址信息 int len=sizeof(sockaddr); char recvbuf128; char sendbuf128; /定义缓冲区 mycomputerinfo.sin_family=AF_INET; mycomputerinfo.sin_port=0;/自动分配端口号 mycomputerinfo.sin_addr.s_addr=INADDR_ANY;/*INADDR_ANY就是指定地址为的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。*/ elsecomputerinfo.sin_family=AF_INET; elsecomputerinfo.sin_port=htons(2000); elsecomputerinfo.sin_addr.s_addr=inet_addr(); /这里填写服务端的IP WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws); huihua=socket(AF_INET,SOCK_STREAM,0); bind(huihua,(sockaddr*)&mycomputerinfo,len); jiancelink=connect(huihua,(sockaddr*)&elsecomputerinfo,len); while(true) if(jiancelink=-1)printf(connect error!please open server before do this.);return; gets(sendbuf); send(huihua,sendbuf,strlen(sendbuf)+1,0); recv(huihua,recvbuf,128,0); char *str=inet_ntoa(elsecomputerinfo.sin_addr); printf(%s 说:%sn,str,recvbuf); closesocket(huihua); WSACleanup();基于UDP协议的控制台通信程序有关UDP通信程序的代码与上面的差不多。我就不再写了。直接上我以前写的一个头文件吧。你一看就明白了。/该头文件用于建立UDP通信/By -ActL 2010-06-13-21:00 #ifndef udp_h#define udp_h#include#include#pragma comment(lib,ws2_32)SOCKET huihua;sockaddr_in myinfo;sockaddr_in elseinfo; /服务端及客户端的地址信息int len=sizeof(sockaddr);char recvbuf128;char sendbuf128;/-/CreateUdpClient函数创建客户端.void CreateUdpClient(int port,char ipstr15)WSADATA ws;WSAStartup(MAKEWORD(2,2),&ws);huihua=socket(AF_INET,SOCK_DGRAM,0);elseinfo.sin_family=AF_INET;elseinfo.sin_port=htons(port); /服务主机端口elseinfo.sin_addr.s_addr=inet_addr(ipstr); /服务主机地址while(true) gets(sendbuf); sendto(huihua,sendbuf,strlen(sendbuf)+1,0,(sockaddr *)&elseinfo,len); recvfrom(huihua
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑装饰工程施工合同
- 聘用临时人员合同2篇
- 瑞氏染色原理步骤课件
- 东莞大型工程保洁方案(3篇)
- 安全文明样板工地培训课件
- 典型工程的材料方案(3篇)
- 桂平市中沙镇新安落窝山矿区陶瓷土项目环境影响报告表
- 班级同学集体生日课件
- 猫虎歌课件教学课件
- 非标工程灯具订制方案(3篇)
- 2025重庆市专业应急救援总队应急救援人员招聘28人考试参考题库及答案解析
- 2025年国际贸易业务员招聘考试试题集及答案
- 2025年建筑涂料采购专项合同
- 高考化学一轮复习:硫及其化合物(好题冲关)原卷版
- 2025年城市环境监测评估标准评估方案
- 2025年水面渔业养殖承包合同范本:水产养殖合作协议
- 水厂反恐知识培训内容课件
- 供应链金融操作指南
- 部编版语文六年级上册3《古诗词三首》(同步练习)(含答案)
- 2025-2026学年湘教版(2024)初中地理七年级上册教学计划及进度表
- 2025年重庆八中宏帆中学小升初自主招生数学试题(含答案详解)
评论
0/150
提交评论