keep_simple

导航

随笔分类 -  网络编程

socketpair的使用
摘要:socketpair函数概要如下:#include <sys/types.h>#include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sv[2]);sys/types.h文件需要用来定义一些C宏常量。sys/socket.h文件必须包含进来定义socketpair函数原型。socketpair函数需要四个参数。他们是:套接口的域套接口类型使用的协议指向存储文件描述符的指针类型参数声明了我们希望创建哪种类型的套接口。socketpair函数的选择如下:SOCK_STREAM 阅读全文

posted @ 2013-05-20 11:14 keep_simple 阅读(1869) 评论(0) 推荐(0)

有关send()和recv()函数的理解
摘要:ssize_t send(int sock, const void *buf, size_t len, int flags);不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数:第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。 这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的 阅读全文

posted @ 2013-04-28 13:55 keep_simple 阅读(626) 评论(0) 推荐(0)

HTTP协议详解(真的很经典)
摘要:HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断 地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下:1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因 阅读全文

posted @ 2013-04-28 13:52 keep_simple 阅读(428) 评论(0) 推荐(0)

unix/linux socket设置非阻塞
摘要:UNIIX/linux下SOCKET主要是同步的,但有阻塞和非阻塞两种方式。阻塞方式定义与前面定义相同,要解决阻塞有两种方法:一种是设置SOCKET属性,设置为非阻塞(fcntl()函数),sockfd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK); 通过设置套接字为非阻塞,你能够有效地"询问"套接字以获得信息。如果尝试着从一个非阻塞的套接字读信息并且没有任何数据,它不允许阻 塞,它将返回 -1 并将 errno 设置为 EWOULDBLOCK。二种是通过select的方式 阅读全文

posted @ 2013-04-28 13:40 keep_simple 阅读(825) 评论(0) 推荐(0)

send和recv解释
摘要:int send(int s, const void *msg, size_t len, int flags); flags取值有:0: 与write()无异MSG_DONTROUTE:告诉内核,目标主机在本地网络,不用查路由表MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式MSG_OOB:指明发送的是带外信息int recv(int s, void *buf, size_t len, int flags);flags取值有:0:常规操作,与read()相同MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式MSG_OOB:指明发送的是带外信息MSG_PEEK:可以查看可读的信 阅读全文

posted @ 2013-04-28 13:36 keep_simple 阅读(1427) 评论(0) 推荐(0)

非阻塞I/O
摘要:套接口缺省是阻塞的。这一点意味着当发出一个不能立即完成的套接口调用时,其进程将被投入睡眠,等待相应操作完成。可能阻塞的套接口调用可分为一下四类。1 输入操作:包括read, readv, recv,recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接口调用这些输入函数之一,而且该套接口的接收缓冲区中没有数据可读,该进程将被投入睡眠,知道达到一些数据。因为TCP是字节流协议,该进程的唤醒就是只要达到一些数据:这些数据既可以是单个字节,也可以是一个完整的TCP分节中的数据。如果想等到某个固定数目的数据可读为止,那么可以调用readn函数或者指定MSG_WAITALL标志。 阅读全文

posted @ 2013-04-28 13:33 keep_simple 阅读(271) 评论(0) 推荐(0)

C10K问题探讨
摘要:编写连接数巨大的高负载服务器程序时,经典的多线程模式和select模式都不再适用。 应当抛弃它们,采用epoll,kqueue,dev/poll来捕获I/O事件。最后简要介绍了AIO。由来 网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题。随着互联网的迅速发展,越来越多的网络服务开始面临C10K问题,作为大型网站的开发人员有必要对C10K问题有一定的了解。本文的主要参考文献是<http://www.kegel.com/c10k.html>。 C10K问题的最大特点是:设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。举个例子: 阅读全文

posted @ 2013-04-28 13:18 keep_simple 阅读(264) 评论(0) 推荐(0)

TCP状态转换机说明
摘要:建立一个 TCP 连接TCP 是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本节将详细讨论一个TCP 连接是如何建立的以及通信结束后是如何终止的。TCP使用三次握手 ( three-way handshake ) 协议来建立连接,图 3-10 描述了三次握手的报文序列。这三次握手为: 请求端(通常称为客户)发送一个 SYN 报文段( SYN 为 1 )指明客户打算连接的服务器的端口,以及初始顺序号( ISN )。服务器发回包含服务器的初始顺序号的 SYN 报文段( SYN 为 1 )作为应答。同时,将确认号设置为客户的 ISN 加 1 以对客户的 SYN 阅读全文

posted @ 2013-04-28 13:04 keep_simple 阅读(351) 评论(0) 推荐(0)

关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
摘要:1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取)。 2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞write返回值没有区 阅读全文

posted @ 2013-04-12 16:48 keep_simple 阅读(484) 评论(0) 推荐(0)

关于socket中阻塞,非阻塞,同步,异步的概念
摘要:这个问题,没弄清爽地话,貌似很不好理解一些问题.1.Send分为阻塞和非阻塞,阻塞模式下,如果正常的话,会直到把你所需要发送的数据发完再返回;非阻塞,会根据你的socket在底层的可用缓 冲区的大 小,来将你的缓冲区当中的数据拷贝过去,有多大缓冲区就拷贝多少,缓冲区满了就立即返回,这个时候的返回值,只表示拷贝到缓冲区多少数据,但是并不代表发 送多少数据,同时剩下的部分需要你再次调用send才会再一次拷贝到底层缓冲区。2.同步和异步是针对通讯的工作模式,阻塞和非阻塞是指socket的I/O操作。实际上对于socket,只存在阻塞和非阻塞,同步与异步是在程序实现上有所不同。以阻塞的方式执行recv 阅读全文

posted @ 2013-04-12 16:30 keep_simple 阅读(425) 评论(0) 推荐(0)

epoll的使用
摘要:epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内核来扩大这个数目,但这 阅读全文

posted @ 2013-04-09 16:24 keep_simple 阅读(239) 评论(0) 推荐(0)

本地socket通信
摘要:1.serverView Code 20 #include <stdio.h> 21 #include <string.h> 22 #include <stdlib.h> 23 #include <unistd.h> 24 #include <sys/socket.h> 25 #include <sys/un.h> 26 27 #define PATH "./tt" 28 29 int main(int argc ,char *argv[]) 30 { 31 int sockfd = 0; 32 str 阅读全文

posted @ 2013-01-29 12:02 keep_simple 阅读(485) 评论(0) 推荐(0)