小编Mat*_*han的帖子

C套接字sockaddr和sockaddr_storage背后的推理

我看功能,如connect()bind()用C插座和发现,他们需要一个指向sockaddr结构.我一直在阅读并使你的应用程序独立于AF,使用sockaddr_storage结构指针并将其转换为sockaddr指针是有用的,因为它具有更大的地址所需的额外空间.

我想知道的是,函数connect()bind()请求sockaddr指针的方法是如何从指针访问数据,指针指向比预期更大的结构.当然,你传递的是你提供它的结构的大小,但是函数用来从指向更大结构的指针获取IP地址的实际语法是struct *sockaddr什么?

这可能是因为我来自OOP语言,但它似乎有点乱,有点乱.

c unix sockets

48
推荐指数
2
解决办法
3万
查看次数

C#反射按名称获取字段或属性

有没有办法为函数提供一个名称,然后返回具有该名称的给定对象上的字段或属性的值?我尝试使用null-coalesce运算符解决它,但显然不喜欢不同的类型(这对我来说也有点奇怪,因为null为null).我可以把它分成如果为空,但必须有一个更好的方法来做到这一点.这是我的函数,带有Comparison对象的两行不能编译,但是我会把它们放在那里以显示我想要做的事情.

private void SortByMemberName<T>(List<T> list, string memberName, bool ascending)
{
   Type type = typeof (T);
   MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName);

   if (info == null)
   {
        throw new Exception("Member name supplied is neither a field nor property of type " + type.FullName);
   }

   Comparison<T> asc = (t1, t2) => ((IComparable) info.GetValue(t1)).CompareTo(info.GetValue(t2));
   Comparison<T> desc = (t1, t2) => ((IComparable) info.GetValue(t2)).CompareTo(info.GetValue(t1));

    list.Sort(ascending ? asc : desc);
}
Run Code Online (Sandbox Code Playgroud)

我听说过可以使用的动态linq,但为了学习,我正在按照自己的方式行事.

.net c# reflection null-coalescing-operator

11
推荐指数
1
解决办法
1万
查看次数

构造WaveIn时出现NAudio InvalidOperationException

我是NAudio的新手,我正在尝试编写一个小程序,用于记录麦克风中的一些音频并将其写入Wave文件.当我在程序的Main函数中调用recordStuff()函数时,程序没有通过WaveIn对象的构造,并且程序死于InvalidOperationException,其中包含消息"使用WaveInEvent在后台线程上记录" .知道NAudio的人可能会告诉我这意味着什么吗?我试过在它自己的线程中调用recordStuff()函数,但我最终得到了相同的结果.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NAudio.Wave;

namespace SimpleWave
{
    class Recorder
    {
        public Recorder()
        {
            writer = new WaveFileWriter("C:\\Users\\Paul\\Desktop\\yeah.wav", new NAudio.Wave.WaveFormat(44100, 1));
        }

        public static List<byte> buff = new List<byte>();
        public static WaveFileWriter writer;

        public void recordStuff()
        {
            // WaveIn Streams for recording
            WaveIn waveInStream;

            waveInStream = new WaveIn();
            waveInStream.DeviceNumber = 0;
            waveInStream.WaveFormat = new WaveFormat(44100, 2);
            writer = new WaveFileWriter(@"C:\Users\Paul\Desktop\this.wav", waveInStream.WaveFormat);

            waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
            waveInStream.StartRecording();
        }

        public void waveInStream_DataAvailable(object sender, WaveInEventArgs e) …
Run Code Online (Sandbox Code Playgroud)

.net c# audio audio-recording naudio

7
推荐指数
1
解决办法
5464
查看次数

在编写Windows服务时,我将大部分代码放在哪里?

我正在进入Windows服务并查看一些教程,但他们都非常愚蠢.它们通常涉及在重写的OnStart方法中打印出一些东西.这听起来好像被称为一次.现在我将把需要连续运行的代码放在哪里?

c# windows-services onstart

5
推荐指数
2
解决办法
1791
查看次数

Haskell 中的嵌套列表推导式

我正在关注这个Haskell 教程并且在高阶函数部分。它定义了一个名为 chain 的函数:

chain :: (Integral a) => a -> [a]
chain 1 = [1]
chain n
    | even n = n:chain (n `div` 2)
    | odd n = n:chain (n * 3 + 1)
Run Code Online (Sandbox Code Playgroud)

有一个练习可以找到长度超过 15 的“链”的数量。他们这样做:

numLongChains :: Int  
numLongChains = length (filter isLong (map chain [1..100]))  
    where isLong xs = length xs > 15
Run Code Online (Sandbox Code Playgroud)

我试图提出一个列表理解,而不是给我链的数量,而是给我一个来自 [1..100] 的比 15 长的链列表。到目前为止,我最接近的尝试如下:

[ [ a | a <- chain b, length a > 15] | b <- …
Run Code Online (Sandbox Code Playgroud)

haskell nested list-comprehension

2
推荐指数
1
解决办法
3964
查看次数

当队列中没有连接时,C 套接字accept() 失败

我正在读一本关于 c 语言套接字的书,并且正在制作一个非常简单的服务器程序。我逐字复制了代码。目前还没有任何东西尝试连接到该服务器程序,并且已多次更改端口以确保。

程序在第一次循环运行时接受方法失败。根据我在手册页中读到的内容,accept 应该阻止调用者直到建立连接,并且如果队列中没有连接,则不会失败。Accept 是否有任何原因会返回小于 0 的值?我将把代码发布到失败的地方:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//Max number of outstanding connection requests
#define MAXPEDNING 5
#define NONE
#define BUFSIZE 1024

int main(int argc, char **argv)
{
    in_port_t servPort;

    #ifdef CMDLINE
        if(argc != 2)
        {
            puts("Error! Usage is <Server Port>");
            return 0;
        }

        servPort = atoi(argv+1);
    #endif //CMDLINE

    #ifdef NONE
        servPort = 2549;
    #endif //NONE

    int servSock;
    if((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    { …
Run Code Online (Sandbox Code Playgroud)

c sockets gcc

1
推荐指数
1
解决办法
2665
查看次数

C malloc函数的大小参数

我正在读一本书中的C语言中的malloc函数获取您希望作为参数分配的内存的"块"数,并根据您将malloc返回的值转换为多少来确定块的数量.例如,在我的系统上,int是4个字节:

int *pointer;

pointer = (int *)malloc(10);
Run Code Online (Sandbox Code Playgroud)

将分配40个字节,因为编译器知道int是4个字节.

这让我感到困惑有两个原因:

  1. 我正在阅读,size参数实际上是你想要分配的字节数,与任何类型的大小无关.

  2. Malloc是一个返回地址的函数.它如何根据从void返回到不同类型的地址的外部强制转换来调整它分配的内存大小?它只是我应该接受的一些编译器魔法吗?

我觉得这本书错了.非常感谢任何帮助或澄清!

这是本书所说的:

char *string;
string = (char *)malloc(80);
Run Code Online (Sandbox Code Playgroud)

80个预留了80块存储空间.块大小由类型转换(char*)设置,这意味着malloc()正在查找80个字符的文本存储.

c memory malloc gcc pointers

0
推荐指数
2
解决办法
2169
查看次数