
C++网络编程
文章平均质量分 67
zhu2695
Coding life....
展开
-
WinSock send函数和recv函数详解
send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程式都用send函数来向TCP连接的另一端发送数据。客户程式一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程式发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明原创 2013-03-14 22:55:45 · 3723 阅读 · 1 评论 -
WinSock IO模型二: WSAAsyncSelect 消息机制
WSAAsyncSelect基于Windows消息机制异步I/O模型,为特定网络事件指定系统通知信息.函数定义: int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent); (1)参数4-1Event:设定用户关心得套接口上的网络事件.形式如:1Event=FD_READ/FD_CLO原创 2013-03-19 22:45:02 · 1052 阅读 · 0 评论 -
IOCP模型与EPOLL模型的比较
IOCP模型与EPOLL模型的比较一:IOCP和Epoll之间的异同。异:1:IOCP是WINDOWS系统下使用。Epoll是Linux系统下使用。2:IOCP是IO操作完毕之后,通过Get函数获得一个完成的事件通知。Epoll是当你希望进行一个IO操作时,向Epoll查询是否可读或者可写,若处于可读或可写状态后,Epoll会通过epoll_wait进行通知。3:I转载 2013-03-24 13:35:32 · 780 阅读 · 0 评论 -
WinSock的五种I/O模型
1、 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权。这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误。但功能强大。为了解决这个问题,提出了进行I/O操作的一些I/O模型原创 2013-03-24 22:14:46 · 1504 阅读 · 1 评论 -
原始套接字(SOCK_RAW)概述
大多数程序员所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的TCP服务应用; (2)数据报式套接字(SOCK_DGRAM):一种无连接的Socket,对应于无连接的UDP服务应用。 从用户的角度来看,SOCK_STREAM、SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的转载 2013-04-14 20:55:12 · 1761 阅读 · 0 评论 -
SOCK_RAW 与 SOCK_STREAM 、SOCK_DGRAM 的区别
其中 SOCK_STREAM (TCP)、SOCK_DGRAM (UDP) 工作在传输层,SOCK_RAW 工作在网络层。SOCK_RAW 可以处理ICMP、IGMP等网络报文、特殊的IPv4报文、可以通过IP_HDRINCL套接字选项由用户构造IP头。原创 2013-04-14 22:06:19 · 16039 阅读 · 1 评论 -
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回值 2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?阻塞与非阻塞write返回值没有区分,都是 0发送数据大小,特别:返回值 3、阻塞模式下read返回值 < 0 && errno != EIN转载 2013-05-02 18:08:11 · 674 阅读 · 0 评论 -
Client向Server send数据,返回 WSAEWOULDBLOCK 错误
参见MSDN中的一段:The FD_WRITE network event is handled slightly differently. An FD_WRITE network event is recorded when a socket is first connected withconnect/ WSAConnect or accepted withaccept/ WSAA转载 2013-05-02 21:59:50 · 873 阅读 · 0 评论 -
Windows Sockets 错误码(ErrorCode)及出错原因
Windows Sockets在头文件winsock.h中定义了所有的错误码,它们包括以“WSA”打头的Windows Sockets实现返回的错误码和Berkeley Sockets定义的错误码全集。定义Berkeley Sockets错误码是为了确保原有软件的可移植性。Windows Sockets错误码列表 表A.1列出了WSAGetLastError()函数返回的可能错转载 2013-05-02 22:16:37 · 7901 阅读 · 0 评论 -
recv() 的返回值
recv函数int recv( SOCKET s, char FAR *buf, int len, int flags);不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步So转载 2013-05-02 22:23:59 · 956 阅读 · 0 评论 -
setsockopt() 设置socket 详细用法
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经转载 2013-05-02 22:53:29 · 1174 阅读 · 0 评论 -
用setsockopt()来控制recv()与send()的超时
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:int nNetTimeout=1000;//1秒,//设置发送超时setsockopt(socket,SOL_SOCKET,SO_SNDTIME转载 2013-05-02 17:43:13 · 1601 阅读 · 0 评论 -
非阻塞connect
参考一:非阻塞的connect主要有以下用途:我们可以把三路握手迭合在其他处理上。说白了就是在握手期间我们还可以干点其他的,不用傻等。我们可以采用该技术同时建立多个连接。既然使用select等待连接的建立, 连接的超时时间可以由我们自行控制。需要处理的一些细节:我们必须处理connect连接立刻建立的情况。 通常连接建立成功,该描述字可写。失败转载 2013-05-04 14:57:22 · 1029 阅读 · 0 评论 -
ioctlsocket() 用法
参考一:Select模型与ioctlsocket的使用方法 int iMode = 1; //0:阻塞 ioctlsocket(socketc,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置 rs=recvfrom(socketc,rbuf,sizeof(rbuf),0,(SOCKADDR*)&addr,&l转载 2013-05-04 15:12:22 · 13273 阅读 · 0 评论 -
WinSock IO模型四: 重叠I/O (完成例程)
完成例程模型相比与事件通知模型有个很大的优点就是不再受64个消息的限制,一个线程可以同时管理成百上千个socket连接,且保持较高的性能。 完成例程相比与完成端口较为逊色,因为它的性能不能随着系统CPU数量的增长而线程增长,不过在我看来已经很强了,呵呵~! 说白了,这些连接都是由系统来帮你管理的。你只需做的一件事就是:开启一个线程来accept进来的连接,剩下的工作交由系统来处理。而你,则原创 2013-03-24 12:12:11 · 1243 阅读 · 0 评论 -
WinSock IO模型三: WSAEventSelect 事件机制
WSAEventSelect模型是WindowsSockets提供的一个有用异步I/O模型。该模型允许在一个或者多个套接字上接收以事件为基础的网络事件通知。Windows Sockets应用程序在创建套接字后,调用WSAEventSelect()函数,将一个事件对象与网络事件集合关联在一起。当网络事件发生时,应用程序以事件的形式接收网络事件通知。使用这个模型的基本思路是为感兴趣的一组网络事件创原创 2013-03-19 23:34:16 · 1297 阅读 · 0 评论 -
socket-accept
摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了。accept函数等待并接受客户请求: #includesys/socket.h>int accept(int sockfd, struct s原创 2013-03-16 13:01:27 · 603 阅读 · 0 评论 -
网络字节序与主机字节序的转换(htonl,htons,inet_addr,ntohl,ntohs,inet_ntoa)
在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会发现这些函数其实是与主机字节序和网络字节序之间转换有关。就是什么网络字节序,什么是主机字节序呢?下面我写出他们之间的转换:用IP地址127.0.0.1为例: 第一步 127 .原创 2013-03-16 16:50:02 · 3437 阅读 · 0 评论 -
socket-bind
摘要:在套接口中,一个套接字只是用户程序与内核交互信息的枢纽,它自身没有太多的信息,也没有网络协议地址和端口号等信息,在进行网络通信的时候,必须把一个套接字与一个地址相关联,这个过程就是地址绑定的过程。许多时候内核会我们自动绑定一个地址,然而有时用户可能需要自己来完成这个绑定的过程,以满足实际应用的需要,最典型的情况是一个服务器进程需要绑定一个众所周知的地址或端口以等待客户来连接。这个事由bind原创 2013-03-16 12:53:45 · 815 阅读 · 0 评论 -
socket-listen
摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是: #includesys/socket.h>int listen(int sockfd, i原创 2013-03-16 12:55:32 · 722 阅读 · 0 评论 -
socket函数
应用程序调用socket函数来创建一个能够进行网络通信的套接字: int socket(int domain,int type,int protocol); 其中“int domain”参数表示套接字要使用的协议簇,协议簇的在“linux/socket.h”里有详细定义,常用的协议簇:· AF_UNIX(本机通信)·原创 2013-03-16 12:50:45 · 851 阅读 · 1 评论 -
socket-connect
摘要:网络编程socket api存在一批核心接口,而这一批核心接口就是几个看似简单的函数,尽管实际上这些函数没有一个是简单。connect函数就是这些核心接口的一个函数,它完成主动连接的过程。connect函数的功能是完成一个有连接协议的连接过程,对于TCP来说就是那个三路握手过程,它的函数原型: int connect(int sockfd,const struct soc原创 2013-03-16 13:03:32 · 896 阅读 · 0 评论 -
IP层分包
1.在数据链路层有个MTU(Maximum Transmission Unit, 它由硬件规定,例如以太网是1500,大多数的链路的MTU都大等于1500),这个值限定了链路层一个帧的大小,使得一个IP数据报(包括包头)的大小不能超过MTU(IP数据报的大小除了受MTU限制外,也受到接收方的IP实现中的重组缓冲区大小的限制,这将在第2点中介绍,不过可能重组缓冲区的大小与本地MTU相同)。如果IP数转载 2013-04-07 11:20:12 · 3363 阅读 · 0 评论 -
UDP分包问题
1.在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.转载 2013-04-07 11:23:46 · 1305 阅读 · 0 评论 -
sendto & recvfrom 详解
参考一:sendto和recvfrom一般用于UDP协议中,但是如果在TCP中connect函数调用后也可以用.sendto()和recvfrom()——利用数据报方式进行数据传输 1. 在无连接的数据报socket方式下,由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为: int sendto(int sockf转载 2013-04-07 11:35:35 · 13849 阅读 · 0 评论 -
TCP/IP 三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客原创 2013-04-07 11:47:28 · 857 阅读 · 0 评论 -
WinSock IO模型四: 重叠I/O (事件通知)
目录:1. 重叠模型的优点2. 重叠模型的基本原理3. 关于重叠模型的基础知识4. 重叠模型的实现步骤5. 多客户端情况的注意事项 一. 重叠模型的优点1. 可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口只是支持NT系统。2. 比起阻塞、select、WSAAsyncSelect以及WSAEventS原创 2013-03-24 11:29:46 · 1170 阅读 · 0 评论 -
WinSock IO模型五: 完成端口
众所皆知,完成端口是在WINDOWS平台下效率最高,扩展性最好的IO模型,特别针对于WINSOCK的海量连接时,更能显示出其威力。众所皆知,完成端口是在WINDOWS平台下效率最高,扩展性最好的IO模型,特别针对于WINSOCK的海量连接时,更能显示出其威力。其实建立一个完成端口的服务器也很简单,只要注意几个函数,了解一下关键的步骤也就行了。这是篇完成端口入门级的文章,分为以下几步来说原创 2013-03-24 12:30:46 · 949 阅读 · 0 评论 -
WinSock IO模型一: select 模型
Select模型是最常见的I/O模型。使用 int select( int nfds , fd_set FAR* readfds , fd_set FAR* writefds,fd_set FAR* exceptfds,const struct timeval FAR * timeout ) ;函数来检查你要调用的Socket套接字是否已经有了需要处理的数据。 select包含三个原创 2013-03-24 12:55:29 · 714 阅读 · 0 评论 -
C++ 消息中间件(MQ4CPP)
最近这段时间在研究消息服务器,在google的时候无意间搜到了MQ4CPP,于是乎就先研究研究,不扯没用的,进入正题:MQ4CPP支持:MultiThreadingSocketsClusterEncriptionCompressionService lookupMessage routing看到MQ4CPP的源码,代码写的非常清晰,让人看起来赏心悦目,对于学习网络编程或者分转载 2016-05-24 23:46:42 · 6454 阅读 · 0 评论