TCP_UDP通信编程入门C++

上传人:M****1 文档编号:431864279 上传时间:2023-06-08 格式:DOC 页数:10 大小:53KB
返回 下载 相关 举报
TCP_UDP通信编程入门C++_第1页
第1页 / 共10页
TCP_UDP通信编程入门C++_第2页
第2页 / 共10页
TCP_UDP通信编程入门C++_第3页
第3页 / 共10页
TCP_UDP通信编程入门C++_第4页
第4页 / 共10页
TCP_UDP通信编程入门C++_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《TCP_UDP通信编程入门C++》由会员分享,可在线阅读,更多相关《TCP_UDP通信编程入门C++(10页珍藏版)》请在金锄头文库上搜索。

1、 TCP/UDP通信编程入门(C+)1.TCP与UDP连接模式的比较TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议.UDP:User Datagram Protocol 用户数据报协议(UDP)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.有关这两种模式如果你想了解更多的话,看这儿 :http:/ http:/ a) .TCP Server创建流程: WSAStartup(.)-socket(.)-bind(.)-lis

2、ten(.)-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(.)-closeso

3、cket(.)-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 t

4、ype, 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结构定

5、义如下: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 so

6、ckaddr */ /这个不用管,只是为了使结构体与sockaddr_in结构体长度匹配. ; 这儿因为要绑定主机,所以必须用结构体sockaddr_in的结构变量记录主机信息。然后再强制类型转换成sockaddr类型。EG:sockaddr_in mycomputerinfo;mycomputerinfo.sin_family=AF_INET;mycomputerinfo.sin_port=htons(端口号) /服务端端口,这里要用htons函数将端口从本地字节序转换为网络字节序才能使用。具体参见http:/ /服务端IP地址。对IP的初始化还有另外一种方式。具体记不清了,自己查阅一下吧。

7、inet_addr(.)函数将字符串转换为32位整数。因为我们输入的IP地址是字符串,所以要转换的。int listen( SOCKET s, int backlog); /这个函数没什么要讲的。最后一个参数是等待连接队列的最大长度。SOCKET accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen); 这个函数用于服务端,进行通信连接用的。注意喽,这儿是个重点。对于TCP连接来说,有两个套接字,一个监听套接字,一个会话套接字。 在这个函数之前使用的套接字为监听套接字,在这个函数及之后使用的套接字则为会话套接字。 再讲讲这两个

8、套接字的运行过程,我们首先是定义了一个监听套接字使用函数 listen(.)去监听来自客户端的连接请求,当我们的监听套接字接收到连接请求,把连接请求传递给会话套接字,然后再从消息队列中取出下一条消息,如果没有消息的话,则处于等待状态。而accept(.)函数接收到连接请求后,则会建立起服务端与客户端的连接,为后面的通信做准备。我这么说,你应该明白吧,很简单的。 int connect( SOCKET s, const struct sockaddr FAR* name, int namelen); 这个函数用于客户端,进行通信连接用的。int recv( SOCKET s, char FAR*

9、 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

10、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:调

11、用操作方式。 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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 工业自动化

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号