网络编程学习笔记(recvfrom很奇怪的一个地方)
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很奇怪的一个地方)相关推荐
- 网络编程学习笔记(recvfrom和sendto函数)
其原型为: #include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags ...
- 15Java网络编程学习笔记
Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- [Linux网络编程学习笔记]索引
一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...
- 编程开发:Linux网络编程学习笔记
非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...
- python网络编程学习笔记(二)
python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...
- 网络编程学习笔记一:Socket编程
"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...
- python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...
python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...
- Linux网络编程学习笔记
声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...
最新文章
- 基于VLC的播放器开发
- codevs 1105 过河
- python3 List 中的字符串合并
- 深入剖析Redis系列(五) - Redis数据结构之字符串
- 解决: This application has no explicit mapping for /error, so you are seeing this as a fallback.
- python无角正方形的绘制_Python无角正方形,用while True怎么写?我写的这个只能画一行,哪个地方出问题了啊?...
- pr中如何自定义序列尺寸
- 【转自人人】本科生如何发表论文
- 宏睿达认证计费管理系统(支持微信公众号)使用说明,爱快路由认证计费系统
- 计算机桌面个性化怎样设置方法,电脑桌面图标怎么个性化自定义设置呢?
- Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
- 第07讲B文件与文件夹操作
- Angular 组件类测试
- OC视频笔记7(自定义初始化方法)8(类方法与实例方法的区别)(为什么NSString后面加*)
- nz-table数据动态横向合并
- 问题: Schrodinger方程的径向Strichartz估计的端点情形
- 医院信息集成平台现状总结
- 读书笔记-人月神话4
- 牢记公式,ardupilot EKF2就是纸老虎(四)!
- pta乙级1031查验身份证(AC)
热门文章
- 有关无人驾驶汽车的思考
- POJ 3620-Avoid The Lakes
- sql server image字段的转换
- 怎么进入python官网-Python的安装及简单的使用
- python编程if语法-Python编程入门基础语法详解经典
- python里面的之前打过的记忆信息-python中的记忆:如何缓存函数的运行结果(1)
- python编写程序的一般步骤-Python编写win程序的操作流程
- pythonis啥意思-Python中is和==的区别
- 用python绘制漂亮的图形-用Python画一些漂亮图形--Quora代码赏析
- python读取excel某一行-Python 读取csv的某行