printf("Write success, pid: %d\n", getpid());
} else if(pid == 0) {
//关闭另外一个套接字
close(socket_pair[0]);
read(socket_pair[1], buf, sizeof(buf));
printf("Read result: %s, pid: %d\n",buf, getpid());
}
for(;;) {
sleep(1);
}
return EXIT_SUCCESS;
sendmsg, recvmsg , send函数的使用
sendmsg, recvmsg , send三个函数的头文件:
#include <sys/types.h>
#include <sys/socket.h>
sendmsg函数
定义函数
int sendmsg(int s, const strcut msghdr *msg, unsigned int flags);
函数说明:sendmsg()用来将数据由指定的socket传给对方主机.
参数s:为已建立好连线的socket, 如果利用UDP协议则不需经过连线操作.
参数msg:指向欲连线的数据结构内容, 参数flags 一般默认为0, 详细描述请参考send().
返回值:成功返回发送的字节数,出错返回-1
recvmsg函数
定义函数
int recvmsg(int s, struct msghdr *msg, unsigned int flags);
函数说明:recvmsg()用来接收远程主机经指定的socket 传来的数据.
参数s 为已建立好连线的socket, 如果利用UDP 协议则不需经过连线操作.
参数msg 指向欲连线的数据结构内容,
参数flags 一般设0, 详细描述请参考send().
返回值:成功则返回接收到的字符数, 失败则返回-1, 错误原因存于errno 中.
send函数
定义函数:int send(int s, const void * msg, int len, unsigned int falgs);
函数说明:send()用来将数据由指定的socket 传给对方主机.
参数s 为已建立好连接的socket.
参数msg 指向欲连线的数据内容.
参数len 则为数据长度.
参数flags 一般设0, 其他数值定义如下:
MSG_OOB 传送的数据以out-of-band 送出.
MSG_DONTROUTE 取消路由表查询
MSG_DONTWAIT 设置为不可阻断运作
MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断.
返回值:成功则返回实际传送出去的字符数, 失败返回-1. 错误原因存于errno.
结构msghdr定义如下:
struct msghdr
{
void *msg_name; //发送或接收数据的地址
socklen_t msg_namelen; //地址长度
strcut iovec * msg_iov; //要发送或接受数据
size_t msg_iovlen; //容器数据长度
void * msg_control; //附属数据
size_t msg_controllen; //附属数据长度
int msg_flags; //接收消息的标志
};
返回值:成功则返回实际传送出去的字符数, 失败返回-1, 错误原因存于errno
错误代码:
1、EBADF 参数s 非合法的socket 处理代码.
2、EFAULT 参数中有一指针指向无法存取的内存空间
3、ENOTSOCK 参数s 为一文件描述词, 非socket.
4、EINTR 被信号所中断.