recv函数详解

 

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编程相关的文章



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 25108