`
hmi213tv
  • 浏览: 11484 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

vc网络编程常用函数2

 
阅读更多

vc网络编程常用函数2
2011年08月29日
  转换函数
  IP地址转换函数:
  unsigned long inet_addr (const char *cp);
  [b]inet_addr将一个点分十进制IP地址字符串转换成32位数字表示的IP地址(网络字节顺序)。
  
 
  char* inet_ntoa (struct in_addr in);
  inet_ntoa将一个32位数字表示的IP地址转换成点分十进制IP地址字符串。
  
 
  这两个函数互为反函数
  [/b] 
   
  字节顺序转换
  htons()--"Host to Network Short"
  htonl()--"Host to Network Long"
  ntohs()--"Network to Host Short"
  ntohl()--"Network to Host Long"
  网络链接函数
  初始化sock连接符:
  int socket(int domain, int type, int protocol);
  函数返回socket描述符,返回-1表示出错
  domain参数只能取AF_INET, protocol参数一般取0
  应用示例:
  TCP方式:sockfd = socket(AF_INET,SOCK_STREAM,0);
  UDP方式:sockfd =socket(AF_INET, SOCK_DGRAM,0);
  绑定端口:
  int bind(int sockfd, struct sockaddr *sa, int addrlen);
  函数返回-1表示出错,最常见的错误是该端口已经被其他程序绑定。
  需要注意的一点:在Linux系统中,1024以下的端口只有拥有root权限的程序才能绑定。
  连接网络(用于TCP方式):
  int connect(int sockfd, struct sockaddr *servaddr, int addrlen);
  函数返回-1表示出错,可能是连接超时或无法访问。返回0表示连接成功,可以通过sockfd传输数据了。
  监听端口(用于TCP方式):
  int listen(int sockfd, int queue_length);
  需要在此前调用bind()函数将sockfd绑定到一个端口上,否则由系统指定一个随机的端口。
  接收队列:一个新的Client的连接请求先被放在接收队列中,直到Server程序调用accept函数接受连接请求。
  第二个参数queue_length,指的就是接收队列的长度 也就是在Server程序调用accept函数之前最大允许的连接请求数,多余的连接请求将被拒绝。
  响应连接请求(用于TCP方式):
  int accept(int sockfd,struct sockaddr *addr,int *addrlen);
  accept()函数将响应连接请求,建立连接并产生一个新的socket描述符来描述该连接,该连接用来与特定的Client交换信息。
  函数返回新的连接的socket描述符,错误返回-1
  addr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等。
  addrlen作为参数表示addr内存区的大小,在函数返回后将被填入返回的addr结构的大小。
  accept缺省是阻塞函数,阻塞直到有连接请求
  应用示例:
  struct sockaddr_in their_addr; /* 用于存储连接对方的地址信息*/
  int sin_size = sizeof(struct sockaddr_in);
  … …(依次调用socket(), bind(), listen()等函数)
  new_fd = accept(sockfd, &their_addr, &sin_size);
  printf(”对方地址: %s\n", inet_ntoa(their_addr.sin_addr));
  … …
  关闭socket连接:
  int close(int sockfd);
  关闭连接将中断对该socket的读写操作。
  关闭用于listen()的socket描述符将禁止其他Client的连接请求。
  部分关闭socket连接:
  int shutdown(int sockfd, int how);
  Shutdown()函数可以单方面的中断连接,即禁止某个方向的信息传递。
  参数how:
  0 - 禁止接收信息
  1 - 禁止发送信息
  2 - 接收和发送都被禁止,与close()函数效果相同
  socket轮询选择:
  int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  应用于多路同步I/O模式(将在同步工作模式中详细讲解)
  
  
  FD_ZERO(*set) 清空socket集合
  
  FD_SET(s, *set) 将s加入socket集合
  
  FD_CLR(s, *set) 从socket集合去掉s
  
  FD_ISSET(s, *set) 判断s是否在socket集合中    常数FD_SETSIZE:集合元素的最多个数
   
  等待选择机制:
  int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
  是select机制的一个变种,应用于多路同步I/O模式(将在同步工作模式中详细讲解)
  ufds是pollfd结构的数组,数组元素个数为nfds。
  struct pollfd {
  int fd; /* file descriptor */
  short events; /* requested events */
  short revents; /* returned events */
  };  
  接收/发送消息:
  [b]TCP方式:

  int send(int s, const void *buf, int len, int flags);
  int recv(int s, void *buf, int len, int flags);
  函数返回实际发送/接收的字节数,返回-1表示出错,需要关闭此连接。
  函数缺省是阻塞函数,直到发送/接收完毕或出错
  注意:如果send函数返回值与参数len不相等,则剩余的未发送信息需要再次发送
  UDP方式:
  int sendto(int s, const void *buf, int len, int flags, const struct sockaddr *to, int tolen);
  int recvfrom(int s,void *buf, int len, int flags, struct sockaddr *from, int *fromlen);
  与TCP方式的区别:
  需要指定发送/接收数据的对方(第五个参数to/from)
  函数返回实际发送/接收的字节数,返回-1表示出错。
  函数缺省是阻塞函数,直到发送/接收完毕或出错
  注意:如果send函数返回值与参数len不相等,则剩余的未发送信息需要再次发送
  基于消息的方式:
  int sendmsg(int s, const struct msghdr *msg, int flags);
  int recvmsg(int s, struct msghdr *msg, int flags);
  发送/接收一个消息,消息使用如下数据结构:
  struct msghdr {
  void * msg_name; /* optional address */
  socklen_t msg_namelen; /* size of address */
  struct iovec * msg_iov; /* scatter/gather array */
  size_t msg_iovlen; /* # elements in msg_iov */
  void * msg_control; /* ancillary data, see below */
  socklen_t msg_controllen; /* ancillary data buffer len */
  int msg_flags; /* flags on received message */
  };
  这种方式可以使用面向连接和无连接两种方式,灵活性较大,但不太常用,将在后面的程序示例(网络仿真设备)中解释工作流程。
  标志位:
  上面这六个发送/接收函数均有一个参数flags,用来指明数据发送/接收的标志,常用的标志主要有:
  MSG_PEEK 对数据接收函数有效,表示读出网络数据后不清除已读的数据
  MSG_WAITALL 对数据接收函数有效,表示一直执行直到buf读满、socket出错或者程序收到信号。
  MSG_DONTWAIT 对数据发送函数有效,表示不阻塞等待数据发送完后返回,而是直接返回。(只对非阻塞socket有效)
  MSG_NOSIGNAL 对发送接收函数有效,表示在对方关闭连接后出错但不发送SIGPIPE信号给程序。
  MSG_OOB 对发送接收都有效,表示读/写带外数据(out-of-band data)
   
  带外数据实例图
  获取设置函数
  取得本地主机名:
  int gethostname(char *hostname, size_t size);
  获得主机名存到hostname中。
  
取得本地的信息:
  int getsockname(int sockfd, struct sockaddr *addr, int *addrlen);
  addr存有返回的主机信息。
  示例:
  [b]struct sockaddr_in sa;
  int len = sizeof(sa);
  getpeername(sockfd, (struct sockaddr *)&sa, &len);
  printf("本地IP:%s", inet_ntoa(sa.sin_addr));
  
[/b] 
  取得对方主机的信息:
  int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
  addr存有返回的主机信息。
  示例:
  [b]struct sockaddr_in sa;
  int len = sizeof(sa);
  getpeername(sockfd, (struct sockaddr *)&sa, &len);
  printf("对方IP:%s", inet_ntoa(sa.sin_addr));
  
[/b]获得DNS信息:
  struct hostent *gethostbyname(const char *name);
  struct hostent *gethostbyaddr(const char *addr, int len, int type);
  返回了一个指向struct hostent的指针,struct hostent定义如下:
  [b]struct hostent {
  [b]char *h_name; /* official name of host */
  char **h_aliases; /* alias list */
  int h_addrtype; /* host address type */
  int h_length; /* length of address */
  char **h_addr_list; /* list of addresses */
  
};
  #define h_addr h_addr_list[0] /* for backward compatibility */
  [/b]对于如何获得DNS信息,将在后面的程序片断中详细讲解。
  DNS操作时的错误处理与普通程序不同,gethostbyname通过设置h_errno代表出错号,对应的错误函数有hstrerror()和herror(),分别对应于strerror()和perror()这两个普通的错误函数。
  [/b]获得或改变socket属性
  int getsockopt(int sockfd, int level, int name, char *value, int *optlen);
  int setsockopt(int sockfd, int level, int name, char *value, int *optlen);
  [b]对于socket编程,level一般为常数SOL_SOCKET
  name属性类型,value属性参数,optlen属性内存块的长度
  常用的有:
  SO_RCVTIMEO,SO_SNDTIMEO:获得或设置socket发送/接收的timeout。
  SO_SNDBUF,SO_RCVBUF:获得或设置socket发送/接收的buffer大小。
  SO_BROADCAST:获得或设置socket状况,使之可以广播发送数据报。(只能用于UDP方式)。
  SO_REUSEADDR:设置该socket绑定的端口可以被重用。
  注意:在Linux系统中,如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端口。可以通过调用以下语句避免该问题:
  [b]opt = 1;
  len = sizeof(opt);
  setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);
  
[/b][/b]获得或改变socket的I/O属性:
  int ioctl(int sockfd,long cmd,unsigned long* argp);
  [b]cmd属性类型,argp属性的参数。
  常用的有:
  FIONREAD,返回socket缓冲区中未读数据的字节数
  FIONBIO,argp为零时为阻塞模式,非零时为非阻塞模式
  SIOCATMARK ,判断是否有未读的带外数据(仅用于TCP协议),返回true或false
  
 
  int fcntl(int fd, int cmd, long arg);
  F_SETFL,arp为O_NONBLOCK时进入非阻塞模式,为0时进入阻塞模式。
  F_GETFL,获得属性。
  
[/b][/b]
分享到:
评论

相关推荐

    VC中网络编程的常用函数

    VC中网络编程的常用函数

    VC与Labview、Matlab编程论文资料[2].rar

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    vc6.0编程助手

    C++编程助手可以将常用或不常用的命令或子程序分类添加到列表中,使用时只需双击命令就可添加到程序编辑区,从而可减少命令的记忆量。如果你忘记变量的定义、函数的创建等格式,可直接从插入菜单选择相应功能以填表...

    VC API常用函数简单例子大全(1-89).docx

    VC API常用函数简单例子大全(1-89) 列举一些VC环境编程的 常用的函数的简单的例子

    VC中的所有WM消息.zip_VC中wm函数_Windows编程_wm 常见消息_wm消息

    常用的WM消息函数,方便大家学习和使用,常用于VC6平台,消息函数比较多,有些不常用的消息容易忘记,好东西大家分享

    VC6MFC函数名解释(上)

    VC6.0MFC函数名解释(上) MFC常用函数名说明解释 帮助更好使用MFC编程

    VC与Labview、Matlab编程论文资料

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    VC与Labview、Matlab编程论文资料[4].rar

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    VC读串口的方法

    用这些方法读串口都非 常简单,只需要调用其提供的相关接口就可以了(有时需要映射消息),不管用何种方法,其实质是串口控件最终都调用了底层API函数ReadFile来读串 口,下面分别讲讲常用控件的读串口方法和直接...

    VC+SDK+常用API函数库

    罗列大量的用于编程或开发的api函数,这样读者在阅读相应的Win32 API函数时就能很快地了解它的具体功能和使用方法,便于更快地掌握该接口函数。

    VC函数小词典2.0.rar

    VC小词典2.0.rar,里面有绝大部分的vc常用函数描述,我想对大家编程应该很有帮助的

    好用的VC++函数查询

    vc++编程常用函数集,攻能强大,实用,能查询各函数的用法.-vc++ programming common function set, attack can be a powerful, practical and able to query the usage of the function.

    Linux+常用C函数(中文版)

    Linux+常用C函数(中文版).pdf ,类似于VC的CSDN,包含了Linux下C语言编程所用到的函数。

    vb编程常用命令集锦

    vb编程常用命令集锦 vb编程常用命令集锦 API函数声明 数据类型与"类型安全" 常 数 结 构 小 结 一些API函数集: 控件与消息函数、硬件与系统函数、菜单函数、绘图函数 什么是API 首先,有必要向大家讲一讲,...

    windows系统API函数介绍

    这是我自己总结的关于在vc6.0底下常用的API函数,对于学习vc下编程的人很有用啊

    《Windows多线程编程技术与实例》-郝文化-书和源码

    本书语言通俗易懂,内容丰富翔实,突出了以实例为中心的特点,既适合具有一定c++和VC编程基础的高校相关专业学生选作多线程编程的学习用书,也适用于具有一定实际编程经验的中高级开发人员作为学习多线程编程思想的...

    VC2008 & MYSQL数据库平台开发文档第二节API函数封装

    包括数据库的初使化、连接、添加、修改、删除等操作,已对MYSQL数据库函数有了初步的了解,在实际编程过程中有一种更加清晰的使用方式,就是把一些常用的API函数集合到一个自定义类中,以类成员函数方式实现功能函数...

    VC CString最全面的总结 常用数据类型使用转换详解等总结

    WINDOWS程序设计中最常用的一些消息: 2 1 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE 2 2 键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP 2 3 鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_...

    浮点计算编程原理、实现与应用

    第2部分 应用:x87fpu编程与vc6浮点库  第8章 x87fpu编程  第9章 编写自己的浮点库  第10章 如何反汇编代码  第11章 vc6浮点函数库  第12章 异常处理机制  第13章 浮点编程中的常见技巧 附录

Global site tag (gtag.js) - Google Analytics