首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++网络,recv()无缘无故失败(?)

C++网络,recv()无缘无故失败(?)
EN

Stack Overflow用户
提问于 2018-08-26 12:43:22
回答 1查看 853关注 0票数 0

我正在用c++编写一个聊天服务器,作为我自己的消遣,但总的来说,我对网络相当陌生。我的知识来自Beej的指南,this site,以及Kurose&Ross的自上而下方法。

我的问题是,我写了类似于你可以在链接中找到的代码,但它不起作用。当我尝试在服务器上使用recv()函数时,程序失败。

我知道recv()可以返回任意数量的字节,但它只返回-1。我知道我需要一个循环来拼凑正在发送的消息,但目前还没有这样的东西。然而,客户端中的send()表示它发送了缓冲区中指定的数量(是的,我知道这可能是大材小用了,但不确定这是不是一个错误)。

对我来说,服务器看起来是...以某种方式封闭了?我很确定我在什么地方搞砸了,有一行代码我真的不太确定(查看评论)。我昨天设法让它工作了,但之后出了点问题。

我对套接字编程和任何类型的网络都是新手,但是函数调用和诸如此类的东西来自指南,我有预感问题会出现在我指定端口和地址的部分,也许字节没有到达服务器,因为我正在将它们发送到其他地方?但是如果accept()起作用了,那不是意味着TCP连接已经形成了吗?之后我就不能使用它了吗?

我使用的是最新版本的Lubuntu linux,如果有帮助的话。

如果你发现了这个问题,你能告诉我如何正确地做吗?无论如何,下面是服务器的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void start() {

    char message[1024] = "";

    int socketfd = socket( AF_INET, SOCK_STREAM, 0 ), opt = 1, new_socket;

    struct sockaddr_in address;
    struct sockaddr_storage cl_addr;
    socklen_t len = sizeof(address);

    if( socketfd != 0 ) {

        address.sin_family = AF_INET;
        address.sin_port = htons( PORT );
        address.sin_addr.s_addr = INADDR_ANY;

        if( setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(int)) < 0 ) {
            perror("Setsockopt failed");
            exit(EXIT_FAILURE);
        }

        if( bind( socketfd, (struct sockaddr*)&address, len ) < 0 ) {           
            perror("Couldn't bind to port");
            exit(EXIT_FAILURE);
        } 

        if( listen( socketfd, 3 ) < 0 ) {
            perror("Listening on port failed");
            exit(EXIT_FAILURE);
        }

        if( (new_socket = accept( socketfd, (struct sockaddr *)&cl_addr, (socklen_t*)&len  ) < 0) ) {
            perror("Couldn't accept request");
            exit(EXIT_FAILURE);
        }

        /// This is where it fails
        std::cout << recv( new_socket, message, 1024, 0) <<  std::endl;
        close(new_socket);
    }
    else {
        perror("Couldn't open socket");
        exit(EXIT_FAILURE);
    }
    close( socketfd );
}

现在是客户端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(void) {

int sockfd;

struct sockaddr_in serv_addr;
char hello[1024] = "Hello";

serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(PORT);

/// I'm not sure about this !! 
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if( sockfd == 0 ) {
    perror("Opening socket failed");
    exit(EXIT_FAILURE);
}

if( connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) != -1 ) {
    /// Says it sent 1024, but sever doesn't recieve it, what gives ?
    int test = send( sockfd, hello, sizeof(hello), 0);
    std::cout << test << std::endl;
}
else {
    perror("Error");
    exit(EXIT_FAILURE);
}

如您所见,它与链接中的代码相似。服务器代码只是一个函数,代码中还有其他部分,比如创建用户文件,但它们都没有在网络部分使用,所以我不想无缘无故地发布另外800行代码。服务器的main()只是创建一个服务器类的对象并在其上调用start()。

我想在我能改进的地方改进,所以如果你注意到我可以做得更好的地方,请告诉我,是通用的编码风格还是其他什么。此外,这是我在这里的第一个问题,我的第一种语言不是英语,请不要对我太苛刻:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-26 13:24:59

这是一个括号问题。

这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if( (new_socket = accept( socketfd, (struct sockaddr *)&cl_addr, (socklen_t*)&len  ) < 0) ) {

=运算符相比,<运算符具有更高的评估优先级。

new_socket被赋值为accept() < 0,这是一个错误的表达式,因此new_socket被赋值为零。

这可能就是你想说的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (new_socket = accept( socketfd, (struct sockaddr *)&cl_addr, (socklen_t*)&len ) < 0)

但这就不容易出错了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new_socket = accept( socketfd, (struct sockaddr *)&cl_addr, (socklen_t*)&len  ); 
if (new_socket < 0) {
        perror("Couldn't accept request");
        exit(EXIT_FAILURE);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52026363

复制
相关文章
基于FPGA的均值滤波(三)
基于FPGA的均值滤波(三) 之二维求和模块 在实现了窗口内一维行方向上的求和操作,现在要得到整个窗口内的像素之和,还必须将每一行的计算结果再叠加起来。但是每一行的计算结果就不可以使用上面的增量更新的
瓜大三哥
2018/02/26
9510
基于FPGA的均值滤波(三)
基于FPGA的均值滤波(一)
均值滤波的数学表达式列出: 由上述公式列出求图像均值的步骤: (1)获取当前窗口所有像素。 (2)计算当前窗口所有像素之和。 (3)将(2)结果除以当前窗口数据总数。 (4)滑动窗口到下一个窗口,直到
瓜大三哥
2018/02/26
1.8K0
基于FPGA的均值滤波(一)
基于FPGA的均值滤波(四)
基于FPGA的均值滤波(四) 之除法电路模块 假定求和结果为sum,计算后的均值为Average,则有 可以通过上式的计算误差为: 以5x5的窗口为例,将除法电路加上后得到的求均值电路如下图所示: r
瓜大三哥
2018/02/26
8790
基于FPGA的均值滤波(四)
基础知识 | R语言数据管理之数据集取子集
在做任何数据分析的第一步,是根据个人需求创建数据集,存储数据的结构是多样的,包括向量,矩阵、数据框、因子以及列表等。其实,以上几个R语言的独特术语,在C++中也会经常用到,导致很多人都会误认为自己很熟悉了,然而在实际的应用中,却经常出现错误。最近在处理一波量大的数据,在运行程序的过程中,因为前期数据处理错误却出现各种bug,经过检查数据集发现是数据管理的问题,为了巩固R语言的基本数据管理,特地重新基础知识。
黑妹的小屋
2020/08/06
2.5K0
基于FPGA的均值滤波(二)
基于FPGA的均值滤波(二) 之一维求和模块 均值滤波按照整体设计可以分为以下几个子模块: (1)一维求和模块,这里记为sum_1D; (2)二维求和模块,这里记为sum_2D; (3)除法转换模块,此模块比较简单,一般情况下不进行模块封装。 (4)行缓存电路实现行列间像素对齐。 整个顶层模块调用sum_2D模块和除法转换电路求取平均值,记为mean_2D。 用FPGA来求和是最简单的事情,所要注意的是求和结果不要溢出。一般情况下,2个位宽为DW的数据想家,至少得用一个DW+1位宽的数据来存放。 假设窗口尺
瓜大三哥
2018/02/26
1.5K0
基于FPGA的均值滤波(二)
pandas获取数据子集
数据子集是原始数据集的部分观察或者变量或者部分观察与变量,这是一个数据选择过程(按着业务的目标选择所需的观察和变量)。
陆勤_数据人网
2019/06/15
1.6K0
K均值算法R语言代码
今天给大家简单的介绍经典的聚类学习算法,K均值算法。 K均值算法的R语言代码 # 加载R包 library(tidyverse) # data manipulation library(cluster) # clustering algorithms library(factoextra) # clustering algorithms & visualization # 数据准备 df <- USArrests # 数据缺失值处理 df <- na.omit(df) # 删除含有缺失值的样本
生信交流平台
2020/08/04
1.4K0
Day5:R语言课程(数据框、矩阵、列表取子集)
数据框(和矩阵)有2个维度(行和列),要想从中提取部分特定的数据,就需要指定“坐标”。和向量一样,使用方括号,但是需要两个索引。在方括号内,首先是行号,然后是列号(二者用逗号分隔)。以metadata数据框为例,如下所示是前六个样本:
科研菌
2020/12/18
17.8K0
Day5:R语言课程(数据框、矩阵、列表取子集)
子集和问题------基于dfs的回溯思想
子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中,S={ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得: 。 试设计一个解子集和问题的回溯法。 对于给定的正整数的集合S={ x1 , x2 ,…,xn }和正整数c,计算S 的一个子集S1,使得: 。 Input 输入数据的第1 行有2 个正整数n 和c(n≤10000,c≤10000000),n 表示S 的大小,c是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。 Output 将子集和问题的解输出。当问题无解时,输出“No Solution!”。
来杯Sherry
2023/05/25
3260
R + python︱数据规范化、归一化、Z-Score
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/51228217
悟乙己
2019/05/26
4.4K0
Caffe中均值文件的问题
本文主要介绍了在Caffe中进行均值文件转换的方法和具体实现。首先介绍了Caffe中对于均值文件的常用形式,然后详细阐述了将均值文件从binaryproto格式转换为npy格式的过程,最后通过实际测试证明了这种方法的有效性和正确性。
GavinZhou
2018/01/02
6580
matlab归一化方法,数据归一化的基本方法
简单公式表达:y = (x-min Value)/(max Value-min Value)
全栈程序员站长
2022/09/10
3K0
批量归一化和层归一化_数据归一化公式
本篇博文主要讲解2015年深度学习领域非常棒的一篇文献:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,这个算法目前已经被大量的应用,最新的文献算法很多都会引用这个算法,进行网络训练,可见其强大之处非同一般啊,采用这个方法网络的训练速度快到惊人啊,感觉训练速度是以前的十倍以上,再也不用担心自己这破电脑每次运行一下,训练一下都要跑个两三天的时间。另外这篇文献跟空间变换网络《Spatial Transformer Networks》的思想神似啊,都是一个变换网络层。
全栈程序员站长
2022/11/07
1.2K0
批量归一化和层归一化_数据归一化公式
PyTorch 数据归一化与反归一化[通俗易懂]
将特征缩放至特定区间 将特征缩放到给定的最小值和最大值之间,或者也可以将每个特征的最大绝对值转换至单位大小。这种方法是对原始数据的线性变换,将数据归一到[0,1]中间。转换函数为:
全栈程序员站长
2022/09/07
4.1K0
[深度学习概念]·数据归一化问题
个人主页--> https://xiaosongshine.github.io/
小宋是呢
2019/06/27
6980
「R」UCSCXenaShiny:基于 R 的 Xena 数据库交互应用
项目地址:https://github.com/openbiox/UCSCXenaShiny[1]
王诗翔呀
2020/07/24
1.3K0
「R」UCSCXenaShiny:基于 R 的 Xena 数据库交互应用
基于玻璃基板的混合光子集成系统
前面笔记介绍过康宁在Glass Interposer方面的进展(OFC2022: 康宁的Glass Interposer封装方案),有两位读者在微信群里留言问到是否其他机构在开发类似的技术。小豆芽这里介绍下德国Fraunhofer IZM在玻璃基板的相关工作,供大家参考。
光学小豆芽
2022/06/14
1.9K0
基于玻璃基板的混合光子集成系统
求列表中列表的数据的总值和平均值
输出dateset是[[1,2,3],[85,9,7],[99,1,58]]这个样子
用户7209445
2020/04/16
3.4K0
r语言求平均值_r语言计算中位数
R中的统计分析通过使用许多内置函数来执行的,这些函数大部分是R基础包的一部分,并且它们将R向量与参数一起作为输入,并在执行计算后给出结果。
全栈程序员站长
2022/09/29
2.2K0
r语言求平均值_r语言计算中位数
数据归一化和两种常用的归一化方法
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是两种常用的归一化方法:
全栈程序员站长
2022/09/10
2.7K0
数据归一化和两种常用的归一化方法

相似问题

调整AudioManager音量

12

as3所需的简单解释

15

如何调整音量设置

12

弹出窗口调整音量

11

调整应用内音量

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文