互联网络程序设计实验实验_第1页
互联网络程序设计实验实验_第2页
互联网络程序设计实验实验_第3页
互联网络程序设计实验实验_第4页
互联网络程序设计实验实验_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验2 socket封装1.实验目标以C+类封装socket2.实验原理类继承体系:3.实验内容(1)socket表现为文件描述符将int socket作为类的成员,类向外暴露各种socket操作编写如下:class Socket private: int sin_size; int sockfd,new_fd; unsigned short port; struct sockaddr_in my_addr,their_addr,get_addr; public: Socket(); virtual Socket(); virtual int Socket(); void SetPort(un

2、signed short in_port); bool Bind(); void SetRemotePort(unsigned short in_port); unsigned short GetRemotePort(); / void GetRemoteAddrees(char *addrees); bool Connect(); void Listen(); void Accept(); int Send(const char *buf,int len); int Sendto(const char *buf,int len); int Recv(char *buf,int len); i

3、nt Recvfrom(char *buf,int len); void Close(); ; class TCP:public Socket public: int Socket(); bool Connect(); ; class UDP:public Socket public: int Socket(); ; class SCTP:public Socket public: int Socket(); bool Connect(); ; #endifsocket的类型很多AF_INETAF_INET6AF_LOCALSOCK_STREAMTCP|SCTPTCP|SCTPyesSOCK_

4、DGRAMUDPUDPyesSOCK_SEQPACKETSCTPSCTPyes以一种统一的形式封装各种不同类型的socket处理如下:/定义class TCP:public Socket public: int Socket(); bool Connect(); ; class UDP:public Socket public: int Socket(); ; class SCTP:public Socket public: int Socket(); bool Connect(); ; /函数int UDP:Socket() sockfd = socket(AF_INET ,SOCK_DGR

5、AM, 0); return sockfd; int TCP:Socket() sockfd = socket(AF_INET,SOCK_STREAM, 0); return sockfd; int SCTP:Socket() sockfd = socket(AF_INET,SOCK_SEQPAKET, 0); return sockfd; (2)考察socket的连接函数socket的地址族不一样,导致sockaddr结构是不一样的,虽然tcp/sctp这样的面向连接的协议可能都会有connect这样的函数,并且连接的动作都差不多,但是connect函数的servaddr参数是不一样的。如何

6、解决相似动作,但是参数类型不同?处理如下:bool TCP:Connect() if(connect(sockfd,(struct sockaddr *)&their_addr, sizeof(struct sockaddr)=-1) return false; return true; bool SCTP:Connect() if(connect(sockfd,(const struct sockaddr *)&their_addr, sizeof(struct sockaddr)=-1) return false; return true; 附录1socket.h#ifndefSOCKET

7、_H #defineSOCKET_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;class Socket private: int sin_size; int sockfd,new_fd; unsigned short port; struct sockaddr_in my_addr,their_addr,get

8、_addr; public: Socket(); virtual Socket(); virtual int Socket(); void SetPort(unsigned short in_port); bool Bind(); void SetRemotePort(unsigned short in_port); unsigned short GetRemotePort(); / void GetRemoteAddrees(char *addrees); bool Connect(); void Listen(); void Accept(); int Send(const char *b

9、uf,int len); int Sendto(const char *buf,int len); int Recv(char *buf,int len); int Recvfrom(char *buf,int len); void Close(); ; class TCP:public Socket public: int Socket(); bool Connect(); ; class UDP:public Socket public: int Socket(); ; class SCTP:public Socket public: int Socket(); bool Connect(

10、); ; #endif 附录2socket.cpp#include server.hSocket:Socket() Socket:Socket() Close(); int UDP:Socket() sockfd = socket(AF_INET ,SOCK_DGRAM, 0); return sockfd; int TCP:Socket() sockfd = socket(AF_INET,SOCK_STREAM, 0); return sockfd; int SCTP:Socket() sockfd = socket(AF_INET,SOCK_SEQPAKET, 0); return soc

11、kfd; int Socket:Socket() sockfd = socket(AF_INET,SOCK_STREAM, 0); return sockfd; void Socket:SetPort(unsigned short in_port) struct hostent *host;host=gethostbyname(192.168.0.225);my_addr.sin_family = AF_INET; port = in_port; my_addr.sin_port = htons(port); my_addr.sin_addr = *(struct in_addr *)host

12、-h_addr);bzero(&(my_addr.sin_zero),8); void Socket:SetRemotePort(unsigned short in_port) their_addr.sin_port=htons(in_port); unsigned short Socket:GetRemotePort() return ntohs(get_addr.sin_port); bool Socket:Bind() if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)=-1) perror(bind er

13、rn);return false; return true; int Socket:Recvfrom(char *buf,int len) int numbytes; socklen_t addr_len = sizeof(get_addr); numbytes = recvfrom(sockfd,buf,len,0,(struct sockaddr *)&get_addr,&addr_len); if(numbytes = -1) return false; bufnumbytes = 0; return numbytes; int Socket:Sendto(const char *buf

14、,int len) return sendto(sockfd,buf,len,0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr); void Socket:Close() close(sockfd); close(new_fd); void Socket:Listen() if(listen(sockfd,10)=-1) coutlisten err!n; void Socket:Accept() socklen_t size = sizeof(struct sockaddr_in); new_fd = accept(sockfd,(struct sockaddr *)&get_addr,&size); if(new_fd=-1) perror(accept err!n); exit(1); int Socket:Recv(char *buf,int len) return recv(new_fd,buf,len,0); int Socket:Send(const char * buf, int len) return send(new_fd,buf,len,0); bool TCP:Connect() if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论