随笔分类 -  网络编程

摘要:TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的。正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约有90%都与开发者对于TCP/IP的理解相关。高层的框架和控件总结了TCP/IP的主要使用模式,并. 阅读全文
posted @ 2011-08-29 06:20 hnrainll 阅读(1292) 评论(0) 推荐(2) 编辑
摘要:下载地址:http://wenku.baidu.com/view/cd1c0819964bcf84b9d57b56.html讲的很好! 阅读全文
posted @ 2011-08-26 20:31 hnrainll 阅读(936) 评论(0) 推荐(0) 编辑
摘要:#include <netdb.h> #include <sys/socket.h> struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。 struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; #define h_addr 阅读全文
posted @ 2011-08-24 10:00 hnrainll 阅读(754) 评论(0) 推荐(0) 编辑
摘要:1、tcp和udp都能发送0字节的数据包,windows下通过GetLastError查看返回值为02、tcp发送0字节的数据包后,接收方调用recv不会接收到该数据包3、udp发送0字节的数据包后,接收方调用recvfrom能够接收到该数据包转自:http://blog.csdn.net/wzx19840423/article/details/6643094 阅读全文
posted @ 2011-08-20 20:23 hnrainll 阅读(1702) 评论(0) 推荐(0) 编辑
摘要:客户和服务器通过调用函数bind时可以指定IP地址或端口号,可以都指定,也可以都不指定,根据期望的结果,对sin_addr和sin_port,或sin6_addr和sin6_port应置为什么值,下面做了总结:l 客户端1. TCP客户端:1) 当TCP客户未绑定IP地址,当它调用connect时内核会根据外出接口给它绑定一个IP地址和一个临时端口号。并且TCP服务器在接到这个连接后会以这个IP地址作为回应数据报的目的IP地址。2) 当TCP客户绑定了IP地址,它就为发出的数据连接指定了一个源IP地址,并且TCP服务器在接到这个连接后会以这个IP地址作为回应数据报的目的IP地址。3) TCP客 阅读全文
posted @ 2011-08-20 18:32 hnrainll 阅读(4969) 评论(0) 推荐(0) 编辑
摘要:1. 基础概念篇1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文 阅读全文
posted @ 2011-08-19 10:10 hnrainll 阅读(694) 评论(0) 推荐(0) 编辑
摘要:“端口”,通俗地讲就是一个通信通道的“门”,各种计算机服务和通信都是通过特定的端口与外部计算机进行通信,像常见的WWW、FTP、Telnet服务一样。随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入/输出接口)已不能满足网络通信的要求,TCP/IP协议作为网络通信的标准协议就解决了这个通信难题。TCP/IP协议集成到操作系统的内核中,这就相当于在操作系统中引入了一种新的输入/输出接口技术。因为在TCP/IP协议中引入了一种称之为“Socket”(套接字)应用程序接口。有了这样一种接口技术,一台计算机就可以通过软件的方式与任何一台具有Socket接口的计算机进行通信。 阅读全文
posted @ 2011-08-18 17:31 hnrainll 阅读(9270) 评论(0) 推荐(0) 编辑
摘要:功能描述:发送消息。send只可用于基于连接的套接字,send 和 write唯一的不同点是标志的存在,当标志为0时,send等同于write。sendto 和 sendmsg既可用于无连接的套接字,也可用于基于连接的套接字。除了套接字设置为非阻塞模式,调用将会阻塞直到数据被发送完。 用法: #include <sys/types.h>#include <sys/socket.h> ssize_t send(int sock, const void *buf, size_t len, int flags);ssize_t sendto(int sock, const v 阅读全文
posted @ 2011-08-16 20:39 hnrainll 阅读(7386) 评论(0) 推荐(0) 编辑
摘要:recv,recvfrom,recvmsg函数用于从套接字接收信息。 ssize_t recv (int s, void *buf, size_t len, int flags); ssize_t recvfrom (int s, void * restrict buf, size_t len, int flags, struct sockaddr * restrict from, socklen_t * restrict fromlen); ssize_t recvmsg (int s, struct msghdr *msg, int flags);recvfrom和recvmsg系统调用用 阅读全文
posted @ 2011-08-16 20:38 hnrainll 阅读(1686) 评论(0) 推荐(0) 编辑
摘要:在一般的socket实现的时候,通常是用参数的形式,将文件描述符(FD)传到子进程或者直接传到read()汉书中。不过如果想以Socket的形式,来传送FD的话,那就要用到sendmsg和recvmsg函数了。关键点,FD的值要通过msg.msg_control来传递的,千万别写到传输用的buff里面,那样做只是简单的传值,没有任何意义的。/*------------------------------------------------- server-------------------------------------------------*/#include <stdio.h 阅读全文
posted @ 2011-08-16 20:38 hnrainll 阅读(2405) 评论(0) 推荐(0) 编辑
摘要:本程序是recvmsg()函数的简单应用:/* ************************************************************************ * Filename: msg.c * Description: * Version: 1.0 * Created: 2011年08月16日 20时07分52秒 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * **************************************************** 阅读全文
posted @ 2011-08-16 20:35 hnrainll 阅读(5256) 评论(1) 推荐(0) 编辑
摘要:名字 recv, recvfrom, recvmsg - 从套接口接收一个消息 概要#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);描述recvfrom和recvmsg()用 阅读全文
posted @ 2011-08-16 20:00 hnrainll 阅读(10163) 评论(0) 推荐(0) 编辑
摘要:首先要安装这个库,其次,要把需要的协议加上,./configure --enable-smtp --enable-pop3makemake install使用curl --version 查看使用版本是否一样smtp代码实例: ################################################################################include <stdio.h> #include <curl/curl.h>size_t read_data(void *ptr, size_t size, size_t nmemb, 阅读全文
posted @ 2011-08-16 10:48 hnrainll 阅读(1714) 评论(0) 推荐(1) 编辑
摘要:struct sockaddr { unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14字节的协议地址*/ }; 上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 struct sockaddr_in { short int sin_family; /* 地址族,AF_xxx 在socket编程中只能是AF_INET */ unsigned short int sin_port; /* 端口号 (使用网络字节顺序) */ struct in_addr sin_ 阅读全文
posted @ 2011-08-03 17:47 hnrainll 阅读(10176) 评论(0) 推荐(0) 编辑
摘要:gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一个地址清单。这些sockaddr结构随后可由套接口函数直接使用。如此以 来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。#include<netdb.h>int getaddrinfo( const char *hostname, const char *servic 阅读全文
posted @ 2011-08-03 17:44 hnrainll 阅读(3145) 评论(0) 推荐(0) 编辑
摘要:int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的 阅读全文
posted @ 2011-07-27 21:03 hnrainll 阅读(760) 评论(0) 推荐(0) 编辑
摘要:一旦我们建立了连接,我们的下一步就是进行通信了.在Linux下面把我们前面建立的通道 看成是文件描述符,这样服务器端和客户端进行通信时候,只要往文件描述符里面读写东西了. 就象我们往文件读写一样. 4.1 写函数write ssize_t write(int fd,const void *buf,size_t nbytes) write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有俩种可能. 1)write的返回值大于0,表示写了部分或者是全部的数据. 2)返回的值小于0,此时 阅读全文
posted @ 2011-07-27 09:29 hnrainll 阅读(576) 评论(0) 推荐(0) 编辑
摘要:在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址: http://www.madore.org/~david/computers/connect-intr.html 另外转载网络上其他兄弟对EINTR错误的处理: 1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs.loveunix.net/vi 阅读全文
posted @ 2011-07-27 09:20 hnrainll 阅读(8728) 评论(0) 推荐(2) 编辑
摘要:Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是Windows的优点)相比,后者无疑在易操作性上更胜一筹。但是为什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非常重要的原因,尤其是Linux强大的网络功能更是引人注目。放眼今天的WAP业务、银行网络业务和曾经红透半边天的电子商务,都越来越倚重基于Linux的解决方案。因此Linux网络编程是非常重要的,而且当我们一接触到Linux网络编程,我 阅读全文
posted @ 2011-07-27 09:07 hnrainll 阅读(651) 评论(0) 推荐(0) 编辑
摘要:值-结果参数(socket编程中一到七的structsockaddr_in的长度参数)1.概念:当函数参数是从内核到进程时,函数被调用时参数大小是一个值,它告诉内核该参数的结构大小避免内核写操作越界,函数返回时,参数的结构大小又是一个结果,它告诉进程内核写进数据的多少,这种参数叫做值-结果参数。2.例子:八个socket编程中涉及的函数中,总是通过指针来传递指向结构的指针。同时结构的长度也作为参数来传递,但是其传递的方法取决于结构的传递方向:侍从内核到进程还是从进程到内核。详细如下:1>.参数从进程到内核:bind、connect从进程到内核传递参数,它明确知道要拷贝多少以及拷贝的数据。 阅读全文
posted @ 2011-07-25 21:37 hnrainll 阅读(628) 评论(0) 推荐(0) 编辑