您的位置:首页 > 理论基础 > 计算机网络

linux网络编程

2015-08-15 08:57 393 查看
Send、recv、sendto、recvfrom等函数详解

1.send()函数

原型: int send(SOCKET s, const char FAR *buf, int len, int flags);

第一个参数:指定发送端套接字描述符。

第二个参数:指明存放一个应用程序要发送数据的缓冲区。

第三个参数:指明实际要发送的数据字节数。

第四个参数:一般设置为0.但是如果要设置非阻塞模式,可以设置为MSG_DONTWAIT。

描述:

Send发送出现错误函数就会返回SOCK_ERROR。同时send函数把buf中的数据成功copy到s的缓冲的剩余空间,它就返回了,此时这些数据并不一定马上被传送到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个socket函数就会返回SOCKET_ERROR。(每一个除send外的socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么socket函数就返回SOCKET_ERROR)

注意:在linux系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

1、recv()函数

原型: int recv(SOCKET s, char FAR* buf, int len, int flag);

第一个参数:接收端套接字描述符

第二个参数:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

第三个参数:指明buf的长度。

第四个参数:一般设置为0,但是如果设置为阻塞I模式,可以设置MSG_DONTWAIT。

(1)首先recv先检查s的发送缓冲中是否有数据或者数据被协议成功发送完毕。

(2)如果发送缓冲中没有数据或已经发送完毕,则recv检查套接字s的接收缓冲区,否则出现错误,返回SOCKET_ERROR。

(3)如果接受缓冲中没有数据或者正在接受数据,那么recv一直等待。(因此在这里可以设置非阻塞模式,),直到协议把数据接受完毕。

(4)如果数据接受完毕之后,则recv把接受到的数据拷贝到缓冲区中,recv函数返回的就是实际拷贝的字节数。

(5)如果recv在拷贝时出错,那么返回SOCK_ERROR;如果recv函数在等待协议接受数据时网络中断,那么它返回0.

(6)如果在非阻塞模式下,返回值返回-1,如果errno的值为EAGAIN,则表示recv没有接受发送端发送过去的数据;如果返回值是-1,并且errno不为EAGAIN,则说明接受到数据,但是返回错误。

注意:在unix系统下,如果recv函数在等待协议接受数据时网络断开了,那么调用recv的进程就会接受到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

Sendto和recvfrom一般用在UDP中,但是如果在TCP中connect函数调用后也可以用。

在无连接的数据报socket方式下,由于本地socket并没有与远程机器建立连接,所以在发送数据时应指明目的的地址:


Int sendto(int sockfd, const void *msg, int len, unsigned int flags, cosnt struct sockaddr *to, int tolen);

该函数比send()函数多了两个参数,to代表目的机的IP地址和端口号信息,而tolen常常被赋值为sizeof(struct sockaddr)。Sendto函数也返回实际发送的数据字节长度或在出现发送错误时返回-1.

Int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

From是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。Fromlen常设置为sizeof(struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接受到字节数或当出现错误时返回-1.并设置响应的errno.

注意: 当你对于数据报socket调用connect()函数时,可以利用send()和recv()进行数据传输,但该socket依然是数据包socket。并且利用传输层的UDP服务。但在发送或接受数据报时,内核会自动为之加上目的和源地址信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程