小编Der*_*mot的帖子

直接在Socket上使用TcpClient有什么好处?

我知道TcpClient是套接字类的包装器,如果使用TcpClient,我可以访问底层套接字,但是包装器究竟做了什么?

当使用TCPClient时,我需要继续调用Receive(),就像我使用套接字一样,或者包装器是否确保我的所有数据都出现?

最后,我可以在服务器和客户端上使用TcpClient来包装套接字(在使用TcpListener接受服务器上的原始连接之后)

c# sockets tcpclient

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

使用c#的Amazon ec2 API版本2签名编码

我在为ec2 API的第2版签名编码哈希时遇到问题.

注意我的版本1签名哈希工作正常,但这是折旧的,我将需要转移到版本2.所以首先这里是有效的代码...

参数只是一个字典,我要做的只是按键对参数进行排序,并附加没有分隔符的每个值对,然后对我的密钥散列该字符串.(再说一遍,注意这很好用)

private string GetVersion1Sig()
{
  string sig = string.Join(string.Empty, parameters.OrderBy(vp => vp.Key).Select(p => string.Format("{0}{1}", p.Key, p.Value)).ToArray());
  UTF8Encoding encoding = new UTF8Encoding();
  HMACSHA256 signature = new HMACSHA256(encoding.GetBytes(_secretAccessKey));
  byte[] hash = signature.ComputeHash(encoding.GetBytes(sig));
  string result = Convert.ToBase64String(hash);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

现在,对于版本2,有一些更改,这里是来自API开发人员指南的doco ...

  1. 创建以后在此过程中需要的规范化查询字符串:

一个.使用自然字节顺序按参数名称对UTF-8查询字符串组件进行排序.参数可以来自GET URI或POST主体(当Content-Type为application/x-www-form-urlencoded时).

湾 URL根据以下规则对参数名称和值进行编码:

•不要对RFC 3986定义的任何未保留字符进行URL编码.这些未保留的字符是AZ,az,0-9,连字符( - ),下划线(_),句点(.)和波浪号(〜).
•百分比用%XY编码所有其他字符,其中X和Y是十六进制字符0-9和大写AF.
•百分比编码扩展的UTF-8字符,格式为%XY%ZA ....
•百分比将空格字符编码为%20(而不是+,如常见的编码方案那样).

注意
当前所有AWS服务参数名称都使用未保留的字符,因此您无需对其进行编码.但是,您可能希望包含代码来处理使用保留字符的参数名称,以备将来使用.

C.使用等号(=)(ASCII字符61)将编码参数名称与其编码值分开,即使参数值为空.

d.使用与号(&)(ASCII代码38)分隔名称 - 值对.

  1. 根据以下伪语法创建要签名的字符串("\n"表示ASCII换行符).StringToSign = HTTPVerb +"\n"+ ValueOfHostHeaderInLowercase +"\n"+ HTTPRequestURI +"\n"+
    CanonicalizedQueryString HTTPRequestURI组件是URI的HTTP绝对路径组件,但不包括查询字符串.如果HTTPRequestURI为空,请使用正斜杠(/).
  2. 使用刚刚创建的字符串,密钥访问密钥作为密钥,使用SHA256或SHA1作为哈希算法,计算符合RFC 2104的HMAC.有关更多信息,请访问http://www.rfc.net/rfc2104.html.
  3. 将结果值转换为base64.
  4. 使用结果值作为Signature请求参数的值.

所以我拥有的是......

private string …
Run Code Online (Sandbox Code Playgroud)

c# hash amazon amazon-ec2

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

Arduino的字符串长度是否有限制?

我已经花了好几个小时在arduino上组合一个简单的JSON对象字符串,以发送到Raspberry Pi运行节点.

我似乎无法成功构建字符串.我试过一次性构建字符串:

"{" + string1 + "," + string2 + "," + string3 + "}" etc...
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用String.replace函数.每次我最后得到一些我的字符串,或者根本没有.以下代码显示了正在发生的事情:

String msg = "{ \"message\" : \"statusUpdate\", ";
String active = " \"active\" : TOKEN, ";
String intakeTemp = " \"intakeTemp\" : TOKEN, ";
String intakeHumid = " \"intakeHumid\" : TOKEN, ";
String exhaustTemp = " \"exhaustTemp\" : TOKEN, ";
String exhaustHumid = " \"exhaustHumid\" : TOKEN, ";
String targetHumid = " \"targetHumid\" : TOKEN, ";
String completed = " \"taskCompleted\" : …
Run Code Online (Sandbox Code Playgroud)

string arduino

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

异步套接字写入 - 发送操作有可能混淆吗?(.NET 套接字)

抱歉,如果之前有人问过这个问题,但我发现很难搜索:

如果我BeginSend().NET socket上使用,我应该在与此(伪)代码类似的代码中期望什么样的行为:

主程序代码:

Network.OutBound.SendData(messageOne);

Network.OutBound.SendData(messageTwo);
Run Code Online (Sandbox Code Playgroud)

Network.OutBound 类

public void SendData(byte[] buffer)
{
     connectedSocket.BeginSend(buffer,0,buffer.Length,SocketFlags.None,SendCompleteMethod);
}

private void SendComplete(arResult)
{
     int bytesSent;
     bytesSent = arResult.EndSend();

     if(bytesSent < arResult.state.buffer.Length)
     {
         //Not all data sent yet, recall BeginSend
         connectedSocket.BeginSend(buffer,bytesSent,buffer.Length - bytesSent,SocketFlags.None,SendCompleteMethod);
     }
     else
     {
         //All data sent successfully
     }
}
Run Code Online (Sandbox Code Playgroud)

正如我使用的那样BeginSend(),当第一个SendData(messageOne)被调用时,它将立即返回,第二个SendData(messageTwo)将被调用。但是,请考虑这样一种情况:消息 1 和消息 2 都发送了大量数据,并且发送完成了部分数据量,因此BeginSend()被召回以发送剩余数据。

这会导致传出套接字中的两个消息字节混淆吗?它们都将在单独的线程池线程中运行,并且都将在同一个套接字上发送。我理解 TCP 套接字确保数据按顺序到达,但是运行时/套接字层如何知道我BeginSend()是后续尝试完成发送 messageOne 还是 messageTwo 的开始?就它而言,在远程端发送和接收的数据不会与写入套接字的顺序相同(即使这似乎是混淆的可能性)

如果是这样,如果我必须序列化对它的访问,Begin/End Send 的意义何在?

我是否应该在完全发送 messageOne 时设置某种标志(即使需要多次BeginSend() …

.net c# sockets

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

SKPaymentQueue:如果我从不调用 finishTransaction: 会发生什么?

我的应用程序将允许用户通过应用程序内购买升级到专业版功能。我正在使用我自己的服务器验证收据数据,并且确认从我的服务器返回,我调用finishTransaction:

如果验证失败(可能不是由于盗版企图)并且我不调用 finishTransaction: 会发生什么?它会无限期地留在队列中吗?

storekit xamarin.ios ios

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

如何检测App何时进入暂停状态?

是否有一个事件被触发,或任何方式告诉我的应用程序何时进入或退出暂停状态?

编辑:我已经阅读了与AppDelegate事件相关的所有文档,并且我知道没有任何办法,从该类检测到移动到暂停状态.

具体来说,如果我的应用程序在后台播放音乐,并且音乐暂停,例如通过遥控器,音乐,以及之后不久的所有执行,都会暂停.当用户通过遥控器(或例如锁定屏幕)再次按下播放时,音乐再次开始并继续执行(app从暂停状态移动到背景状态).有什么方法可以检测到这个吗?我需要关闭一些服务,如断开网络套接字,停止bonjour服务等...

iphone objective-c multitasking

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