Linux Socket常用读写函数

8 篇文章 0 订阅

做笔记使用,如果有写错了的地方还请指正!!!谢谢!!

/*
    总结一些Webserver用到的函数参数及功能
*/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/uio.h>


int main(int argc, char* argv[]){
    // socket(), bind(), listen(), accept()是基本通信流程,不用管
    // 创建socket套接字,返回的是文件描述符
    int socketfd = socket(AF_INET,SOCK_STREAM,0);

    // 存放端口地址信息的结构体
    sockaddr_in addr;
    addr.sin_addr.s_addr = inet_addr("192.168.231.231"); // IP地址
    addr.sin_family = PF_INET; // 地址协议族
    addr.sin_port = htons(1000); // 端口号

    // 绑定socket套接字与端口地址
    bind(socketfd,(sockaddr*)&addr,sizeof(addr));

    // socket套接字监听
    listen(socketfd, 5);

    // 存放多元素数据的非连续缓冲区
    // struct iovec {
    //     void* iov_base; /* 起始地址 */
    //     size_t iov_len; /* 字节大小 */
    // };
    // 对于每一个传输的元素,指针成员iov_base指向一个缓冲区,这个缓冲区是存放的是readv所接收的数据或是writev将要发送的数据。
    iovec vec[2];
    vec[0].iov_base = NULL;
    vec[0].iov_len = 0;

    char buf[1024];

    // #include <unistd.h>
    // 参数:文件描述符,读写缓冲区,一次性读写的最大字节数
    // 作用:将缓冲区的数据写到socket缓冲区/ 从socket缓冲区读取数据
    read(socketfd, &buf, 1024);
    write(socketfd, &buf, 1024);

    // #include <sys/uio.h>
    // 参数:文件描述符,iovec结构体数组,缓冲区数量
    // 作用:一次调用中读/写多个非连续缓冲区,缓冲区用iovec结构体记录,iovec结构体数据分别是起始地址,和缓冲区大小
    writev(socketfd, vec, 2);
    readv(socketfd, vec, 2);

    // #include <sys/socket.h>
    // socket设计的数据传输函数
    // 参数:文件描述符,读写缓冲区,缓冲区大小,flag
    // 作用:读数据到指定buffer,写数据到socketfd
    send(socketfd,&buf,sizeof(buf),0);
    recv(socketfd,&buf,sizeof(buf),0);

    socklen_t len = sizeof(addr);
    // 作用:用于UDP通信,因为UDP通信公用一个服务端缓冲区,需要根据客户端的端口地址信息才能准确区分数据来源
    // 参数:文件描述符,缓冲区,缓冲区大小,flag,客户端/服务端地址信息,客户端/服务端地址长度
    recvfrom(socketfd,&buf,sizeof(buf),0,(sockaddr*)&addr, &len);
    sendto(socketfd,&buf,sizeof(buf),0,(sockaddr*)&addr, sizeof(addr));


    // struct msghdr {
    //     void *msg_name;//适用于套接字未连接的场合,指向地址结构,表示数据往哪个地址发送或数据接受自哪个地址,已连接(TCP或调用了connect的UDP)则设为NULL
    //     socklen_t msg_namelen;//地址长度,配合msg_name使用
    //     struct iovec *msg_iov;//缓冲区数组,对应readv和writev中的参数
    //     int msg_iovlen;//缓冲区数组y数目
    //     void *msg_control;//辅助数据的地址,指向控制信息结构体cmsghdr
    //     socklen_t msg_controllen;//辅助数据的大小
    //     int msg_flags;//接收端用,会根据实际的接受情况,将该标记设置为对应值
    // }
    msghdr msg;
    msg.msg_name = NULL; // 用于套接字未连接的场合
    msg.msg_namelen = 0;
    msg.msg_iov = vec;
    msg.msg_iovlen = 2;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;
    msg.msg_flags = 1;
    // 最通用函数,集大成者
    sendmsg(socketfd,&msg,0);
    recvmsg(socketfd,&msg,0);

    return 0;
}

 溜了溜了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想是优秀社畜

您的打赏是对我最大的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值