`
zxxSsdsd
  • 浏览: 9702 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

网络编程

阅读更多
                                     基本TCP套接字
更加详细的信息请参考《Unix网络编程 卷1:套接字联网API》,里面详细列举出返回某种状态码时对应何种情况和其他更加详细的介绍。
TCP套接字建立过程需要服务器端按照 socket() -> bind() -> listen() -> accept() 然后等待客户端的连接请求,客户端需要 socket() -> connect() 来连接服务器。 连接成功两者通过write() read() 来进行交互。最后两者通过close() 来结束本次连接

int socket(int family, int type, int protocol) 返回:若成功则为非负描述符,若出错则为-1 family,AF_INET 是IPv4协议,AF_INET6是IPv6协议;type,SOCK_STREAM是字节流套接字(TCP/IP) SOCK_DGRAM是数据包套接字(UDP) SOCK_RAW是原始套接字;protocol,IPPROTO_TCP是TCP传输协议 IPPROTO_UDP是UDP传输协议。
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen) 返回:若成功则为0,若出错则为-1 sockfd是客户端socket函数返回的套接字描述符
int bind(sockfd, const struct sockaddr *myaddr, socklen_t addrlen) 返回:若成功则为0,若出错则为-1 sockfd是服务器端socket函数返回的套接字描述符
int listen(int sockfd, int backlog) 返回:若成功则为0,若出错则为-1 
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)  



                                        基本UDP套接字
UDP是不安全的非连接的网络层协议。UDP服务器通过 socket() -> bind() - > recvfrom() 一直等待客户端的数据请求。 UDP客户端通过socket() -> sendto() 然后和服务器端进行数据交换。

ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, sturct sockaddr *from, socklen_t addrlen) 返回:若成功则为读或写的字节数,若出错则为-1
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen) 返回:若成功则为读或写的字节数,若出错则为-1




                                        其他函数



int getsockopt(int sockfd, intlevel, int optname, void *optval, socklen_t *optlen) 返回:0--成功,-1--出错
int setsockopt(int sockfd, intlevel, int optname, void *optval, socklen_t *optlen) 返回:0--成功,-1--出错

在Windows Socket API中对应如下:
读取socket属性:
int getsockopt(SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen)
s为欲读取属性的套接字。level为套接字选项的级别,大多数是特定协议和套接字专有的。如IP协议应为 IPPROTO_IP。
optname为读取选项的名称
optval为存放选项值的缓冲区指针。
optlen为缓冲区的长度
用法:
int ttl=0; //读取TTL值
int rc = getsockop( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));
设置socket属性:
int setsockopt(SOCKET s,int level, int optname,const char FAR * optval, int optlen)
s为欲设置属性的套接字。
level为套接字选项的级别,用法同上。
optname为设置选项的名称
optval为存放选项值的缓冲区指针。
optlen为缓冲区的长度
用法:
int ttl=32; //设置TTL值
int rc = setsockopt( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));


以下这段 摘自百度百科:http://baike.baidu.com/view/569217.htm
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。
  有两种套接口的选项:一种是布尔型选项,允许或禁止一种特性;另一种是整形或结构选项。允许一个布尔型选项,则将optval指向非零整形数;禁止一个选项optval指向一个等于零的整形数。对于布尔型选项,optlen应等于sizeof(int);对其他选项,optval指向包含所需选项的整形数或结构,而optlen则为整形数或结构的长度。SO_LINGER选项用于控制下述情况的行动:套接口上有排队的待发送数据,且closesocket()调用已执行。参见closesocket()函数中关于SO_LINGER选项对closesocket()语义的影响。


   TCP_NODELAY是唯一使用IPPROTO_TCP层的选项,其他所有选项都使用SOL_SOCKET层。
*******************************************************************************
    SO_BROADCAST BOOL 允许套接口传送广播信息。
  SO_DEBUG BOOL 记录调试信息。
  SO_DONTLINER BOOL 不要因为数据未发送就阻塞关闭操作。设置本选项相当于将SO_LINGER的l_onoff元素置为零。
  SO_DONTROUTE BOOL 禁止选径;直接传送。
  SO_KEEPALIVE BOOL 发送“保持活动”包。
  SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留。
  SO_OOBINLINE BOOL 在常规数据流中接收带外数据。
  SO_RCVBUF int 为接收确定缓冲区大小。
  SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑(参见bind())。
  SO_SNDBUF int 指定发送缓冲区大小。
  TCP_NODELAY BOOL 禁止发送合并的Nagle算法。
  setsockopt()不支持的BSD选项有:
  选项名 类型 意义
  SO_ACCEPTCONN BOOL 套接口在监听。
  SO_ERROR int 获取错误状态并清除。
  SO_RCVLOWAT int 接收低级水印。
  SO_RCVTIMEO int 接收超时。
  SO_SNDLOWAT int 发送低级水印。
  SO_SNDTIMEO int 发送超时。
  SO_TYPE int 套接口类型。
  IP_OPTIONS 在IP头中设置选项。



u_long   htonl(u_long hostlong) 将u_long类型的主机字节顺序格式的IP地址转换为TCP/IP网络字节顺序格式
u_short   htons(u_short hostshort) 将u_short类型的主机字节顺序格式的IP地址转换为TCP/IP网络字节顺序格式
u_long   ntohl(u_long netlong) 将TCP/IP网络字节顺序格式转换为u_long类型的主机字节顺序格式的IP地址
u_short   ntohs(u_short netshort) 将TCP/IP网络字节顺序格式转换为u_short类型的主机字节顺序格式的IP地址
unsigned long   inet_addr( const char FAR * cp ); 将用点分割的IP地址转换位一个in_addr结构的地址,这个结构的定义见笔记(一),实际上就是一个unsigned long值。计算机内部处理IP地址可是不认识如192.1.8.84之类的数据。 举例:inet_addr("192.1.8.84")=1409810880; inet_addr("127.0.0.1")= 16777343
char FAR *   inet_ntoa( struct in_addr in ); char * ipaddr=NULL;       char addr[20];       in_addr inaddr;       inaddr. s_addr=16777343;       ipaddr= inet_ntoa(inaddr);       strcpy(addr,ipaddr);
int   WSAGetLastError(void ) 读取当前错误值:每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码。
int   getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen ); 获取套接字的本地地址结构:s为套接字,name为函数调用后获得的地址值,namelen为缓冲区的大小。
int   getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen ) 获取与套接字相连的端地址结构:s为套接字,name为函数调用后获得的端地址值,namelen为缓冲区的大小。
int   gethostname( char FAR * name, int namelen ) 获取计算机名:name是存放计算机名的缓冲区,namelen是缓冲区的大小。用法:       char szName[255];       memset(szName,0,255);       if(gethostname(szName,255)==SOCKET_ERROR)       {       //错误处理       }       返回值为:szNmae="xiaojin"
struct hostent FAR *   gethostbyname( const char FAR * name ); 根据计算机名获取主机地址。name为计算机名。       用法:       hostent * host;       char* ip;       host= gethostbyname("xiaojin");       if(host->h_addr_list[0])       {       struct in_addr addr;        memmove(&addr, host->h_addr_list[0],4);       //获得标准IP地址       ip=inet_ ntoa (addr);       }       返回值为:hostent->h_name="xiaojin"           hostent->h_addrtype=2     //AF_INET           hostent->length=4           ip="127.0.0.1"




int closesocket(SOCKET s) 关闭socket
int shutdown(SOCKET s, int how) 不允许进行某些操作(包括读、写、读写等)
分享到:
评论

相关推荐

    Java网络编程第三版.pdf

    《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...

    Unix网络编程英文版PDF

    《Unix网络编程》是学习Unix系统下网络编程的重要书籍。这本书的英文版由Addison-Wesley出版社出版,是UNIX Network Programming系列的第一卷,第三版。在第三版中,作者对第二版内容进行了更新,添加了对新的编程...

    TCP IP网络编程

    扫描版 超清百度网盘资源!!! 为初学者准备的网络编程! 韩国TCP/IP经典教程!... 本书针对网络编程初学者,面向具备C语言基础的套接字网络编程学习者,适合所有希望学习Linux和Windows网络编程的人。

    Windows网络编程.pdf

    Windows 网络编程 概述 Windows 网络编程是指在 Windows 操作系统平台上进行网络编程的技术,涉及到 Windows Socket、网络协议、网络应用程序的开发等方面。 Windows 网络编程的主要目的是实现高性能的网络应用...

    C++网络编程文档

    C++网络编程是计算机科学中的一个重要领域,它允许开发者创建能够通过网络进行通信的应用程序。这份"C++网络编程文档"涵盖了这一主题的广泛内容,旨在帮助程序员深入理解并掌握网络编程的基本概念和技术。 首先,...

    c#网络编程实例教程源代码

    《C#网络编程实例教程源代码》是一份深入浅出的教学资源,旨在帮助开发者掌握C#语言在网络编程领域的应用。这份教程结合了理论与实践,提供了丰富的源代码示例,让学习者能够通过实际操作来理解和掌握网络编程的核心...

    Linux网络编程教程pdf完整版

    《Linux网络编程教程》这本书是Linux系统中进行网络编程的重要参考资料。它涵盖了广泛的知识点,旨在帮助读者理解和掌握如何在Linux环境下开发网络应用程序。以下是对这些主题的详细阐述: 1. **网络编程基础**:...

    java网络编程第四版pdf

    《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...

    unix网络编程三卷合一中文版

    在计算机网络编程领域,Unix系统无疑占据着举足轻重的地位。它以其强大的网络功能、稳定的性能和跨平台的特点,吸引了无数程序员和研究者深入探索其内部机制。《Unix网络编程》作为该领域内的一部经典著作,由W. ...

    c++网络编程实例.pdf

    C++ 网络编程实例 本文档提供了 C++ 网络编程的基础知识,涵盖了网络编程的概述、OSI 七层网络模型、TCP/IP 协议和 C/S 编程模型等内容。 网络编程概述 网络编程是指用户使用 MFC 类库在 VC 编译器中编写程序,以...

    unix网络编程一二卷

    《Unix网络编程》是一套备受推崇的计算机网络编程经典著作,分为两卷,全面而深入地探讨了在Unix操作系统环境下进行网络应用开发的各种技术和实践。这两卷书籍是无数程序员和系统管理员学习网络编程的重要参考资料。...

    Linux网络编程,包括tcp/upd,select/poll/epoll/pdf

    linux网络编程 pdf # Linux网络编程基础 Linux网络编程是指在Linux操作系统上开发网络应用程序的过程。它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议...

    Java网络编程(第4版)PDF

    《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...

    Visual C++网络编程案例实战.pdf

    《Visual C++网络编程案例实战》一书深入探讨了如何利用Visual C++及MFC类库进行网络编程,尤其强调了Windows Socket的应用。本书不仅覆盖了理论基础,还提供了丰富的实践案例,帮助读者掌握网络编程的核心技能。 #...

    Java网络编程实验报告.pdf

    "Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...

    Java网络编程案例教程习题参考答案 .pdf

    Java网络编程案例教程习题参考答案 Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程...

    UNIX网络编程第1卷(1-19章)

    《UNIX网络编程》第一卷主要涵盖了网络编程的基本概念、传输层协议TCP和UDP的细节、套接口编程的原理与应用,以及高级网络编程技术。该书是网络编程领域的经典之作,作者是著名的网络编程专家W. Richard Stevens。...

    核心网络编程 网络编程必备

    《核心网络编程》是一本专为Windows环境设计的网络编程指南,它深入浅出地讲解了网络编程的基础知识和高级技巧。这本书对于那些希望在Windows平台上进行网络应用开发的程序员来说,是不可或缺的参考资料。 首先,书...

    IT公司笔试\linux c网络网络编程面试题收集

    Linux C 网络编程面试题收集 本文总结了 Linux C 网络编程面试题,涵盖了基础知识、网络编程、路由等方面的知识点,旨在帮助读者更好地理解和掌握相关知识。 一、基础知识 1. 对于程序 `func(char *str){printf(...

Global site tag (gtag.js) - Google Analytics