recv函数详解
作者:admin 日期:2011-08-03
int recv( SOCKET s, char FAR* buf, int len, int flags );
上面是这个函数的原型,这个应该不用多说了。
下面说说几个参数吧。
s是套接字,这个一般是connect之后的socket或者是accept返回的socket句柄。
buf 这是一个指向缓冲区的指针。
len 这个参数代表可以接受的最多的字节数,一般设置成buf的长度。
flags 一般我们用这个参数的时候,可以设为0.大多数时候我们是这么做。其实它还有另外一个选择是MSG_PEEK,用这个参数的时候,只从socket里读出数据,但并不会从socket里面把数据移除。
下面说说recv的返回值吧
有下面三种返回值:
大于0的值,表示recv成功,返回的是实际接受的字节数。
等于0的值,这个一般表示连接被关闭了。
小于0的值,这个一般就是SOCKET_ERROR了,值=-1;表示出错了。出错的话,可以用WSAGetLastError来获取详细的错误代码。
有几种常见的错误代码:
10038:在一个非套接字上尝试了一个操作。这个错误在多线程的时候容易出现。做socket的时候,前后之间最好加入错误的判断。
10057:这个错误,表示套接字没有连接。有时候connect之后没有判断,直接调用recv就有可能出现这种错误。
10014:这个表示指针非法了。使用之前把缓冲区分配好就可以了,现在一般很少出现内存不足的情况。还有就是要注意len的大小,如果len太大的话,会导致缓冲区溢出。要是你用这个在你的电脑上开一个端口,轻者导致程序崩溃,重者被别人拿到和程序一样高的权限。
查看其它与 socket编程相关的文章
评论: 0 | 查看次数: 25624