其原型为:

#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);ssize_t sendto(int sockfd, void *buff, size_t nbytes, const struct sockaddr* to, socklen_t addrlen);

服务器端:

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#define SERV_PORT 9999
#define BUF_LEN 128void dg_echo(int sockfd, struct sockaddr_in *pcliaddr, socklen_t clilen)
{char buf[BUF_LEN]; socklen_t len;int n;for (;;) {len = clilen;if ((n = recvfrom(sockfd, buf, BUF_LEN, 0, (struct sockaddr*)pcliaddr, &len)) < 0) {printf("recvfrom error:%s\n", strerror(errno));continue;} sendto(sockfd, buf, n, 0, (struct sockaddr*)pcliaddr, len);}
}int main(int argc, char **argv)
{struct sockaddr_in servaddr, clientaddr;int sockfd;sockfd = socket(AF_INET, SOCK_DGRAM, 0);   if (sockfd < 0) {printf("socket error:%s\n", strerror(errno));return -1;}memset(&servaddr, 0x00, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {printf("bind error:%s\n", strerror(errno));close(sockfd); return -1;}dg_echo(sockfd, &clientaddr, sizeof(clientaddr));return 0;
}

客户端:

#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>#define SERV_PORT 9999
#define BUF_LEN 128void dg_cli(FILE *fp, int sockfd, const struct sockaddr_in * pservaddr, socklen_t servlen)
{int n;char sendline[BUF_LEN], recvline[BUF_LEN];while (fgets(sendline, BUF_LEN, fp) != NULL) {sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)pservaddr, servlen);    n = recvfrom(sockfd, recvline, BUF_LEN, 0, NULL, NULL);recvline[n] = 0;fputs(recvline, stdout);}
}int main(int argc, char **argv)
{struct sockaddr_in servaddr;int sock;memset(&servaddr, 0x00, sizeof(servaddr));    servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);   if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) < 0) {printf("inet_pton error:%s\n", strerror(errno));return -1;}sock = socket(AF_INET, SOCK_DGRAM, 0);   if (sock < 0) {printf("socket error:%s\n", strerror(errno));return -1;}dg_cli(stdin, sock, &servaddr, sizeof(servaddr));return 0;
}

网络编程学习笔记(recvfrom和sendto函数)相关推荐

  1. 网络编程学习笔记(recvmsg和sendmsg函数)

    这两个函数是最通用的I/O函数.实际上,可以用recvmsg代替read.readv.recv和redvfrom.同样,各种输出函数都可以用sendmsg取代 #include<sys/sock ...

  2. 网络编程学习笔记(recv和send函数)

    与read和write函数相似,只是多了一个附加的参数,其函数原型为: #include <sys/socket.h> ssize_t recv(int sockfd, void *buf ...

  3. 网络编程学习笔记(UDP的connect函数)

    对于已连接的UDP套接口,发生了三个变化: 1.再也不能给输出操作指定目的IP地址和端口,也就是说,不能再调用 sendto,而使用send或者write.写到已连接UDP套接口上的任何东西都自动发送 ...

  4. 网络编程学习笔记(getservbyname和getservbyport函数)

    通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...

  5. 网络编程学习笔记(recvfrom很奇怪的一个地方)

    recvfrom的最后一个参数不赋值时,返回的是一个很大的数.赋值后就是正常的 服务器端: #include <sys/socket.h> #include <netinet/in. ...

  6. 网络编程学习笔记(readv和writev函数)

    这两个函数与read和write相似,但readv和writev可以让我们在一个函数调用中读取多个缓冲区,这些操作被称为分散读和集中写.其函数原型为: #include <sys/uio.h&g ...

  7. 网络编程学习笔记(getsockopt和setsockopt函数)

    其原型为: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, ...

  8. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  9. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

最新文章

  1. arduino小车前进代码_基于Arduino操纵杆扩展板Funduino制作机器人小车
  2. 敏捷结果30天之第六天:周五回顾,找到三件做的好以及三件需要改善的事情...
  3. javascript闭包-全局变量与局部变量
  4. JAVA-retry 重试
  5. ES6语法大全 export,import,for.of循环,promise等等
  6. JAVA里16进制和字节数组互转
  7. 最小花费(信息学奥赛一本通-T1344)
  8. python封装sql脚本_flask-sqlalchemy如何使用原生的sql语句然后封装?
  9. mysql.sys用户权限_MySQL用户及权限小结
  10. python微信自动发消息系统
  11. 一种电力线宽带载波系统采样频偏的估计方法
  12. 人工智能--符号计算--笔记
  13. 键盘没有NumLock这个键 怎样解锁数字键盘?
  14. 详解cmd修复系统命令操作方法
  15. 使用杉川3i-T1单线激光雷达和Cartographer库SLAM问题及解决
  16. mysql设置固定ip地址访问_mysql设置指定ip访问,用户权限相关操作
  17. can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
  18. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
  19. Python新闻网站项目-5.Django新闻网站前后端展示
  20. cad坐标归零lisp_CAD图如何归零?

热门文章

  1. Ubuntu安装Nginx+PHP+Memcache+Mysql指导手册
  2. Linux常用命令速查备忘(包括我)
  3. TM、XWT和Wazaabi
  4. python简单代码表白-如何正确使用Python进行表白
  5. python是不是特别垃圾-11道Python最基本的面试题,不会好好反思吧!
  6. 济南python工资一般多少钱-济南python开发培训机构哪个好
  7. 对于python来说、一个模块就是一个文件-彻底明白Python package和模块
  8. 学python需要学数据库吗-python支持哪些数据库
  9. 以下属于python标准库的选项是-Python 标准库一览(Python进阶学习)
  10. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法