recvfrom的最后一个参数不赋值时,返回的是一个很大的数。赋值后就是正常的

服务器端:

#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 <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SERV_PORT 9999
#define BUF_LEN 128char *sock_ntop(const struct sockaddr* sockaddr, socklen_t len)
{static char str[BUF_LEN];char portstr[7];printf("sa_family1=%d, AF_INET=%d\n", sockaddr->sa_family, AF_INET);switch (sockaddr->sa_family) {case AF_INET:printf("enter...\n");      struct sockaddr_in *sin = (struct sockaddr_in*)sockaddr;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == (const char *)NULL) {printf("inet_ntop error:%s\n", strerror(errno));return NULL;}  if (ntohs(sin->sin_port) != 0) {snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));strcat(str, portstr);}return str;} return NULL;
}void dg_cli(FILE *fp, int sockfd, const struct sockaddr_in * pservaddr, socklen_t servlen)
{int n;char sendline[BUF_LEN], recvline[BUF_LEN];struct sockaddr reply_addr;socklen_t len;while (fgets(sendline, BUF_LEN, fp) != NULL) {sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)pservaddr, servlen);   //memset(&reply_addr, 0x00, sizeof(reply_addr));len = servlen;n = recvfrom(sockfd, recvline, BUF_LEN, 0, &reply_addr, &len);printf("sa_family=%d, servlen=%d, len=%d\n", reply_addr.sa_family, servlen, len);    if (len != servlen || memcmp(&reply_addr, pservaddr, len) != 0) {printf("receive (%s) ignored\n", sock_ntop(&reply_addr, len));continue;}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;
}

输出为:

客户端没有赋值时,输出的乱码:

#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SERV_PORT 9999
#define BUF_LEN 128char *sock_ntop(const struct sockaddr* sockaddr, socklen_t len)
{static char str[BUF_LEN];char portstr[7];printf("sa_family1=%d, AF_INET=%d\n", sockaddr->sa_family, AF_INET);switch (sockaddr->sa_family) {case AF_INET:printf("enter...\n");      struct sockaddr_in *sin = (struct sockaddr_in*)sockaddr;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == (const char *)NULL) {printf("inet_ntop error:%s\n", strerror(errno));return NULL;}  if (ntohs(sin->sin_port) != 0) {snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));strcat(str, portstr);}return str;} return NULL;
}void dg_cli(FILE *fp, int sockfd, const struct sockaddr_in * pservaddr, socklen_t servlen)
{int n;char sendline[BUF_LEN], recvline[BUF_LEN];struct sockaddr reply_addr;socklen_t len;while (fgets(sendline, BUF_LEN, fp) != NULL) {sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)pservaddr, servlen);   //memset(&reply_addr, 0x00, sizeof(reply_addr));//len = servlen;n = recvfrom(sockfd, recvline, BUF_LEN, 0, &reply_addr, &len);printf("sa_family=%d, servlen=%d, len=%d\n", reply_addr.sa_family, servlen, len);  if (len != servlen || memcmp(&reply_addr, pservaddr, len) != 0) {printf("receive (%s) ignored\n", sock_ntop(&reply_addr, len));continue;}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;
}

输出就不正确,接收的长度及sa_family都是不正确的

哦,原来是这样的

recvfrom()recvfrom() places the received message into the buffer buf.  Thecaller must specify the size of the buffer in len.If src_addr is not NULL, and the underlying protocol provides thesource address of the message, that source address is placed in thebuffer pointed to by src_addr.  In this case, addrlen is a value-result argument.  Before the call, it should be initialized to thesize of the buffer associated with src_addr.  Upon return, addrlen isupdated to contain the actual size of the source address.  Thereturned address is truncated if the buffer provided is too small; inthis case, addrlen will return a value greater than was supplied tothe call.If the caller is not interested in the source address, src_addr andaddrlen should be specified as NULL.

当中有这样一段话:

 Before the call, it should be initialized to thesize of the buffer associated with src_addr.  Upon return, addrlen isupdated to contain the actual size of the source address.

网络编程学习笔记(recvfrom很奇怪的一个地方)相关推荐

  1. 网络编程学习笔记(recvfrom和sendto函数)

    其原型为: #include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags ...

  2. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  3. java 网络编程学习笔记

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

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

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

  5. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  6. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  7. 网络编程学习笔记一:Socket编程

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...

  8. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  9. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

最新文章

  1. 基于VLC的播放器开发
  2. codevs 1105 过河
  3. python3 List 中的字符串合并
  4. 深入剖析Redis系列(五) - Redis数据结构之字符串
  5. 解决: This application has no explicit mapping for /error, so you are seeing this as a fallback.
  6. python无角正方形的绘制_Python无角正方形,用while True怎么写?我写的这个只能画一行,哪个地方出问题了啊?...
  7. pr中如何自定义序列尺寸
  8. 【转自人人】本科生如何发表论文
  9. 宏睿达认证计费管理系统(支持微信公众号)使用说明,爱快路由认证计费系统
  10. 计算机桌面个性化怎样设置方法,电脑桌面图标怎么个性化自定义设置呢?
  11. Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
  12. 第07讲B文件与文件夹操作
  13. Angular 组件类测试
  14. OC视频笔记7(自定义初始化方法)8(类方法与实例方法的区别)(为什么NSString后面加*)
  15. nz-table数据动态横向合并
  16. 问题: Schrodinger方程的径向Strichartz估计的端点情形
  17. 医院信息集成平台现状总结
  18. 读书笔记-人月神话4
  19. 牢记公式,ardupilot EKF2就是纸老虎(四)!
  20. pta乙级1031查验身份证(AC)

热门文章

  1. 有关无人驾驶汽车的思考
  2. POJ 3620-Avoid The Lakes
  3. sql server image字段的转换
  4. 怎么进入python官网-Python的安装及简单的使用
  5. python编程if语法-Python编程入门基础语法详解经典
  6. python里面的之前打过的记忆信息-python中的记忆:如何缓存函数的运行结果(1)
  7. python编写程序的一般步骤-Python编写win程序的操作流程
  8. pythonis啥意思-Python中is和==的区别
  9. 用python绘制漂亮的图形-用Python画一些漂亮图形--Quora代码赏析
  10. python读取excel某一行-Python 读取csv的某行