• 1、sendto和recvfrom函数介绍 sendto(经socket传送数据) 相关函数 send , sendmsg,recv , recvfrom , socket 表头文件 #include #include ...int sendto ( int s , const void * msg, int l

    1、sendto和recvfrom函数介绍


    sendto(经socket传送数据)

    相关函数
    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 中。
    错误代码
    EBADF 参数s非法的socket处理代码。
    EFAULT 参数中有一指针指向无法存取的内存空间。
    WNOTSOCK canshu s为一文件描述词,非socket。
    EINTR 被信号所中断。
    EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。
    ENOBUFS 系统的缓冲内存不足。
    EINVAL 传给系统调用的参数不正确。

     

     

    recvfrom(经socket接收数据)

     

    相关函数
    recv,recvmsg,send,sendto,socket
    表头文件
    #include<sys/types.h>
    #include<sys/socket.h>
    定义函数
    int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
    函数说明
    recv()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。
    返回值
    成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。
    错误代码
    EBADF 参数s非合法的socket处理代码
    EFAULT 参数中有一指针指向无法存取的内存空间。
    ENOTSOCK 参数s为一文件描述词,非socket。
    EINTR 被信号所中断。
    EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。
    ENOBUFS 系统的缓冲内存不足
    ENOMEM 核心内存不足
    EINVAL 传给系统调用的参数不正确。



    2、单客户端和服务端的通信(基于UDP)   图解



    3、单客户端和服务端的通信(基于UDP)   代码


    1、服务端代码socket3.c

    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<netdb.h>
    #include<errno.h>
    
    #define PORT 8888
    #define MAX_MSG_SIZE 1024
    
    int main(void)
    {
       int sockfd, addrlen, n;
       struct sockaddr_in addr;
       char msg[MAX_MSG_SIZE];
       sockfd = socket(AF_INET, SOCK_DGRAM, 0);
       if (sockfd < 0)
       {
          fprintf(stderr, "socket failed\n");
          exit(EXIT_FAILURE);
       }
       addrlen = sizeof(struct sockaddr_in);
       bzero(&addr, addrlen);
       addr.sin_family = AF_INET;
       addr.sin_addr.s_addr = htonl(INADDR_ANY);
       addr.sin_port = htons(PORT);
       if (bind(sockfd, (struct sockaddr*)(&addr), addrlen) < 0)
       {
          fprintf(stderr, "bind fail\n");
          exit(EXIT_FAILURE);
       }
       puts("bind success");
       while (1)
       {
          bzero(msg, MAX_MSG_SIZE);
          n = recvfrom(sockfd, msg, sizeof(msg), 0, (struct sockaddr *)(&addr), &addrlen);
          fprintf(stdout, "Recevie message from client is %s\n", msg);
          fgets(msg, MAX_MSG_SIZE,stdin);
          printf("Server endpoint input message %s\n", msg);
          sendto(sockfd, msg, n, 0,(struct sockaddr *)(&addr), addrlen);
       }
       close(sockfd);
       exit(EXIT_SUCCESS);
    }
    


    2、客户端代码socket4.c


    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<string.h>
    
    #define MAX_BUF_SIZE 1024
    #define PORT 8888
    
    int main() 
    {
       int sockfd, addrlen, n;
       char buffer[MAX_BUF_SIZE];
       struct sockaddr_in addr;
       sockfd = socket(AF_INET, SOCK_DGRAM, 0);
       if (sockfd < 0)
       {
          fprintf(stderr, "socket falied\n");
          exit(EXIT_FAILURE);
       }
       addrlen = sizeof(struct sockaddr_in);
       bzero(&addr, addrlen);
       addr.sin_family = AF_INET;
       addr.sin_port = htons(PORT);
       addr.sin_addr.s_addr = htonl(INADDR_ANY);
         
       puts("socket success");
       while(1)
       {
           bzero(buffer, MAX_BUF_SIZE);
           fgets(buffer, MAX_BUF_SIZE, stdin);
           sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)(&addr), addrlen);
           printf("client send msg is %s\n", buffer);
           n = recvfrom(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)(&addr), &addrlen);
           fprintf(stdout, "clinet Receive message from server is %s\n", buffer);
       }
       close(sockfd);
       exit(0);
       return 0;
    }
    



    4、运行结果



    5、总结

    服务端:socket->bind->(sendto 、revcfrom)

    客户端:socket->(sendto 、revcfrom)

    upd不是面相连接的,这个是和tcp本质区别,数据可能会乱序,重复。



    展开全文
  • Linux多线程服务端编程:使用muduo+C网络库.pdf Linux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:...
  • Linux服务端编程经验 2017-12-09 21:06:03
    学习linux服务端编程的过程中跟一个拥有多年linux服务端编程经验的前辈请教了一番,有的地方理解的获取没有那么透彻, 在这里记录一下,后期内功修炼的差不多了再回来看看是否有新的理解。 主流服务器模式 做过很多...
  • Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]《Linux多线程服务端编程...
  • TCP网络编程本质论思维转换:把原来“主动调用recv(2)来接收数据,主动调用accept(2)来接受新连接,主动调用send(2)来发送数据”的思路转换为“注册一个收数据的回调,网络库收到数据会调用我,直接把数据提供给我,...
  • Linux多线程服务端编程 2020-07-08 23:30:28
    Linux多线程服务端编程:使用muduo C 网络库》样章.pdf
  • Linux多线程服务端编程:使用muduo C++网络库 本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。...
  • 本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loopper thread。这是在Linux 下以native 语言编写用户态高性能网络...
  • 最进在学习linux网络编程,就来做一些笔记,防止自己忘记加深印象。 1.创建监听的套接字 /* 1.创建监听的套接字 用到的函数 int socket(int domain, int type, int protocol); 第一个参数 指定一个一个地址协议...
  • Linux多线程服务端编程 使用muduo C++网络库 PDF电子书下载 带目录书签 完整版.part3
  • linux多线程服务端编程muduo网络库的使用 读后感
  • Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]@ckook 《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]@ckook
  • 浅析linux服务端socket编程 2015-12-02 16:42:57
    记得大一第一次接触linux服务端编程时,当时看的1.Socket接口socket接口用来创建一个套接字描述符,函数定义如下int socket(int domain,int type,int protocol); //成功返回文件描述符,失败返回-1参数介绍: ....
  • Linux多线程服务端编程:使用muduo C++网络库(陈硕 著).pdf
  • Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。 作者说:以下谈一谈这...
  • Linux 多线程服务端编程》多看电子版:http://www.duokan.com/book/76600《Linux 多线程服务端编程》繁体版由佳魁資訊在台湾出版发行:http://www.books.com.tw/products/0010644288
  • Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程...
  • Richard Stevens 的传世经典《UNIX 网络编程》, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下手? 书中示例代码把业务逻辑和 Sockets 调用混在一起,似乎不利于将来...
  • Linux多线程服务端编程 使用muduo C++网络库 PDF电子书下载 带目录书签 完整版.part2
1 2 3 4 5 ... 20
收藏数 44,349
精华内容 17,739