zoukankan      html  css  js  c++  java
  • UDP中的sendto 与recvfrom

    sendto

    头文件

    #include <sys/types.h>   #include <sys/socket.h>

    定义函数

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

    参数说明
    s:一个标识套接口的描述字。 
    buf:包含待发送数据的缓冲区。 
    len:buf缓冲区中数据的长度。 
    flags:调用方式标志位。 
    to:(可选)指针,指向目的套接口的地址。 
    tolen:to所指地址的长度。


    函数说明

    sendto() 用来将数据由指定的socket 传给对方主机. 参数s 为已建好连线的socket, 如果利用UDP协议则不需经过连线操作. 参数msg 指向欲连线的数据内容, 参数flags 一般设0, 详细描述请参考send(). 参数to 用来指定欲传送的网络地址, 结构sockaddr 请参考bind(). 参数tolen 为sockaddr 的结果长度.

    返回值

    成功则返回实际传送出去的字符数, 失败返回-1, 错误原因存于errno 中.

    错误代码
    1、EBADF 参数s 非法的socket 处理代码.
    2、EFAULT 参数中有一指针指向无法存取的内存空间.
    3、WNOTSOCK canshu s 为一文件描述词, 非socket.
    4、EINTR 被信号所中断.
    5、EAGAIN 此动作会令进程阻断, 但参数s 的soket 为补课阻断的.
    6、ENOBUFS 系统的缓冲内存不足.
    7、EINVAL 传给系统调用的参数不正确.

    范例
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet.in.h>
    #include <arpa.inet.h>
    #define PORT 2345 /*使用的port */
    main()
    {
        int sockfd, len;
        struct sockaddr_in addr;
        char buffer[256];
        //建立socket
        if(sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
            perror ("socket");
            exit(1);
        }
        //填写sockaddr_in 结构
        bzero(&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr = hton1(INADDR_ANY);
        if(bind(sockfd, &addr, sizeof(addr)) < 0)
        {
            perror("connect");
            exit(1);
        }
        while(1)
        {
            bezro(buffer, sizeof(buffer));
            len = recvfrom(socket, buffer, sizeof(buffer), 0, &addr &addr_len);
            //显示client 端的网络地址
            printf("receive from %s ", inet_ntoa(addr.sin_addr));
            //将字串返回给client 端
           sendto(sockfd, buffer, len, 0, &addr, addr_len);
        }
    }

    recvfrom

    头文件

    #include <sys/types.h>   #include <sys/socket.h>

    定义函数

    int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen);

    参数说明

    s:标识一个已连接套接口的描述字。 
    buf:接收数据缓冲区。 
    len:缓冲区长度。 
    flags:调用操作方式。 
    from:(可选)指针,指向装有源地址的缓冲区。 
    fromlen:(可选)指针,指向from缓冲区长度值。
     
    返回值: 
    若无错误发生,recvfrom()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。 

    错误代码: 
    WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。 
    WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。 
    WSAEFAULT:fromlen参数非法;from缓冲区大小无法装入端地址。 
    WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。 
    WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 
    WSAEINVAL:套接口未用bind()进行捆绑。 
    WSAENOTCONN:套接口未连接(仅适用于SOCK_STREAM类型)。 
    WSAENOTSOCK:描述字不是一个套接口。 
    WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM类型的。 
    WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再用recv()接收数据。 
    WSAEWOULDBLOCK:套接口标识为非阻塞模式,但接收操作会产生阻塞。 
    WSAEMSGSIZE:数据报太大无法全部装入缓冲区,故被剪切。 
    WSAECONNABORTED:由于超时或其他原因,虚电路失效。 
    WSAECONNRESET:远端强制中止了虚电路。 
     
  • 相关阅读:
    Luogu 4206 [NOI2005]聪聪与可可
    【Luogu】P3708Koishi的数字游戏(数论)
    【Luogu】P1850换教室(期望DP)
    【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)
    【Luogu】P3865ST表模板(ST表)
    【Luogu】P3376网络最大流模板(Dinic)
    【Luogu】P1005矩阵取数游戏(高精度+DP)
    【Luogu】P2324骑士精神(IDA*)
    【Luogu】P3052摩天大楼里的奶牛(遗传算法乱搞)
    洛森地图半成品
  • 原文地址:https://www.cnblogs.com/gaoshaonian/p/9360480.html
Copyright © 2011-2022 走看看