zoukankan      html  css  js  c++  java
  • C语言sendto()函数-经socket传送数据以及recvfrom函数《转》

    相关函数:send, sendmsg, recv, recvfrom, socket

    头文件:#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);

    函数说明: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()
     
     
     
    /*利用socket的UDPclient
    此程序会连线UDPserver,并将键盘输入的字符串传给server。
    UDPserver范例请参考sendto()。
    */
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #definePORT2345
    #defineSERVER_IP“127.0.0.1”
    main()
    {
    ints,len;
    structsockaddr_inaddr;
    intaddr_len=sizeof(structsockaddr_in);
    charbuffer[256];
    /*建立socket*/
    if((s=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.s_addr=inet_addr(SERVER_IP);
    while(1){
    bzero(buffer,sizeof(buffer));
    /*从标准输入设备取得字符串*/
    len=read(STDIN_FILENO,buffer,sizeof(buffer));
    /*将字符串传送给server端*/
    sendto(s,buffer,len,0,(structsockaddr*)&addr,addr_len);
    /*接收server端返回的字符串*/
    len=recvfrom(s,buffer,sizeof(buffer),0,(structsockaddr*)&addr,(socklen_t*)
    &addr_len);
    printf(“receive:%s”,buffer);
    }
    }
    执行(先执行udpserver再执行udpclient)
    hello/*从键盘输入字符串*/
    receive:hello/*server端返回来的字符串*/
    一分耕耘,一分收获!
  • 相关阅读:
    ASP.NET教程4
    ASP.NET教程11
    TreeView Demo
    System.Net.Dns.GetHostByAddress(string) 已经过时
    会员注册实例
    ASP.NET教程2
    多表关联与表值函数
    ASP.NET教程6
    BusinessFrameWork
    ASP.NET教程8
  • 原文地址:https://www.cnblogs.com/splovecyk/p/4449365.html
Copyright © 2011-2022 走看看