需要通过Socket获得字节帮助(Need help on bytes via Socket)
我正在尝试通过套接字发送一些数据,因此它被转换为字节,然后返回到服务器上的字符串。 但我显然只能做一件事。
服务器代码:
static void Read(IAsyncResult ar) { int fileNameLen = 1; //int userNameLen = 9; State newState = (State)ar.AsyncState; //gets state of Socket Socket handler = newState.Socket_w; //passes Socket to handler int bytesRead = handler.EndReceive(ar); //terminates Data Receive from Socket. if (bytesRead > 0) { if (flag == 0) { fileNameLen = BitConverter.ToInt32(newState.buffer, 0); //gets filename length fileName = Encoding.UTF8.GetString(newState.buffer, 4, fileNameLen); //gets filename //userNameLen = BitConverter.ToInt32(newState.buffer, 8); //getUsername = Encoding.UTF8.GetString(newState.buffer, 8, fileNameLen); flag++; } } }
客户代码:
internal static void uploadFile(string host, string username, string getGame, string filename, string filepath) { byte[] m_clientData; Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] fileName = Encoding.UTF8.GetBytes(username + "_" + filename); byte[] fileData = File.ReadAllBytes(filepath); byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //byte[] sendUsername = Encoding.UTF8.GetBytes(username); //byte[] sendUsernameLen = BitConverter.GetBytes(sendUsername.Length); //byte[] sendGame = Encoding.UTF8.GetBytes(getGame); //byte[] sendGameLen = BitConverter.GetBytes(sendGame.Length); m_clientData = new byte[4 + fileName.Length + fileData.Length]; fileNameLen.CopyTo(m_clientData, 0); fileName.CopyTo(m_clientData, 4); fileData.CopyTo(m_clientData, 4 + fileName.Length); //sendUsernameLen.CopyTo(m_clientData, 0); //sendUsername.CopyTo(m_clientData, 4); //sendGameLen.CopyTo(m_clientData, 0); //sendGame.CopyTo(m_clientData, 4); clientSock.Connect(host, 8889); clientSock.Send(m_clientData); //tofix exception clientSock.Close(); }
我似乎无法在服务器上正确解密它。 任何人都可以帮助我缓冲区和诸如此类的东西?
I'm trying to send a couple of data via Sockets, so it's converted to bytes and then back to String on the Server. But I can only do one apparently.
Server code:
static void Read(IAsyncResult ar) { int fileNameLen = 1; //int userNameLen = 9; State newState = (State)ar.AsyncState; //gets state of Socket Socket handler = newState.Socket_w; //passes Socket to handler int bytesRead = handler.EndReceive(ar); //terminates Data Receive from Socket. if (bytesRead > 0) { if (flag == 0) { fileNameLen = BitConverter.ToInt32(newState.buffer, 0); //gets filename length fileName = Encoding.UTF8.GetString(newState.buffer, 4, fileNameLen); //gets filename //userNameLen = BitConverter.ToInt32(newState.buffer, 8); //getUsername = Encoding.UTF8.GetString(newState.buffer, 8, fileNameLen); flag++; } } }
Client code:
internal static void uploadFile(string host, string username, string getGame, string filename, string filepath) { byte[] m_clientData; Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] fileName = Encoding.UTF8.GetBytes(username + "_" + filename); byte[] fileData = File.ReadAllBytes(filepath); byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //byte[] sendUsername = Encoding.UTF8.GetBytes(username); //byte[] sendUsernameLen = BitConverter.GetBytes(sendUsername.Length); //byte[] sendGame = Encoding.UTF8.GetBytes(getGame); //byte[] sendGameLen = BitConverter.GetBytes(sendGame.Length); m_clientData = new byte[4 + fileName.Length + fileData.Length]; fileNameLen.CopyTo(m_clientData, 0); fileName.CopyTo(m_clientData, 4); fileData.CopyTo(m_clientData, 4 + fileName.Length); //sendUsernameLen.CopyTo(m_clientData, 0); //sendUsername.CopyTo(m_clientData, 4); //sendGameLen.CopyTo(m_clientData, 0); //sendGame.CopyTo(m_clientData, 4); clientSock.Connect(host, 8889); clientSock.Send(m_clientData); //tofix exception clientSock.Close(); }
I can't seem to decrypt it properly over on Server. Can anyone help me with the buffersizes and whatnot?
原文:https://stackoverflow.com/questions/14128657
最满意答案
它正在返回HTML,因为它使用quoted-printable编码对其进行编码,这是在邮件消息中实际发送内容的方式。
如果您想获得没有编码的内容,可以试试这个:
$part = $mail->getBodyHtml(); // returns Zend_Mime_Part if ($part !== false && $part instanceof Zend_Mime_Part) { $html = $part->getRawContent(); // returns the raw, unencoded content }
使用Zend_Mail :: setBodyHtml()设置正文HTML时,可以指定编码。 函数原型是
setBodyHtml($html, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
有效选项是
- Zend_Mime :: ENCODING_7BIT
- Zend_Mime :: ENCODING_8BIT
- Zend_Mime :: ENCODING_QUOTEDPRINTABLE(默认)
- Zend_Mime :: ENCODING_BASE64
如果可能,您可以在调用setBodyHtml之前验证HTML,或者使用上面显示的方法检索原始的未编码内容。 否则getBodyHtml()将以其编码格式返回HTML。
It is returning the HTML like that because it is encoding it using quoted-printable encoding which is how the content is actually sent in the mail message.
If you would like to get the content without the encoding, you can try this:
$part = $mail->getBodyHtml(); // returns Zend_Mime_Part if ($part !== false && $part instanceof Zend_Mime_Part) { $html = $part->getRawContent(); // returns the raw, unencoded content }
When you set the body HTML with Zend_Mail::setBodyHtml(), you can specify the encoding. Function prototype is
setBodyHtml($html, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
Valid options are
- Zend_Mime::ENCODING_7BIT
- Zend_Mime::ENCODING_8BIT
- Zend_Mime::ENCODING_QUOTEDPRINTABLE (default)
- Zend_Mime::ENCODING_BASE64
You can either validate the HTML before you call setBodyHtml if possible, or retrieve the raw, unencoded content using the method shown above. Otherwise getBodyHtml() will return the HTML in its encoded format.
相关问答
更多-
如何使用Zend_Mail,sendmail和localhost发送电子邮件?(How to send an email using Zend_Mail, sendmail, and localhost?)[2023-06-16]
听起来你需要配置一个MTA,或者找到一个你可以发送到的MTA。 Ubuntu桌面应该默认设置一个,可能是exim或postfix,但是如果你没有配置它,它将不可能运行。 It sounds like you need to configure an MTA, or find one that you can send to. Ubuntu desktop should set one up by default, probably either exim or postfix, but if you hav ... -
无法理解为什么Zend_Mail :: addHeader()去掉换行符(Can't understand why Zend_Mail::addHeader() strips newlines)[2024-02-10]
你可能会遇到一些事情。 根据RFC 2821 ,SMTP中的文本行不能超过1000个字符: 文本行 包含该文本行的最大总长度为1000个字符(不包括透明度重复的前导点)。 使用SMTP服务扩展可能会增加此数字。 头文件不能包含换行符,所以这可能是Zend剥离它们的原因。 对于长标题,通常插入一个换行符(SMTP中的CRLF)和一个标签来“包装”它们。 摘自RFC 822 : 每个标题字段可以被视为一个单一的ASCII字符逻辑行,由一个字段名和一个字段体组成。 为了方便起见,这个概念实体的字段 - 主体部分可 ... -
这不是Zend问题,而是Apple Mail问题。 安装Thunderbird ;-) 这里有一些提示: 如果您同时发送内联文件和附件,可能会出现这样的问题 邮件应用程序设置默认为内联附件 关闭邮件 开放式终端 输入命令defaults write com.apple.mail DisableInlineAttachmentViewing -bool yes , 打开邮件,然后重试 你不应该在设置体中明确指定编码,你的邮件是用默认的'UTF-8'编码初始化的 您不应该编码标题,除非您使用不使用基于罗马字母的 ...
-
“滚动自己的邮件”通常被大型托管电子邮件系统视为垃圾邮件。 当您使用付费服务发送大量电子邮件时,您正在支付这些公司与主要电子邮件供应商达成的协议,以使其保持白名单。 但是,您可以做的一件事是确保您发送的帐户存在,并且电子邮件是从匹配的域发送的(例如,从foo.com的smtp服务器发送的@ foo.com)。 这是垃圾邮件过滤器的一个大红旗。 "Roll your own mail" is often treated as spam by large hosted email systems. When y ...
-
我认为你需要使用SSL作为ssl类型。 另外,您使用完整的电子邮件作为用户名吗? $config = array('host'=> 'pop.gmail.com', 'user' => 'xxx', 'password' => 'xxx', 'ssl' => 'SSL', 'port' => 995); I think you need to use SSL as the ssl type. Also, are you using your ...
-
Zend_Mail :: addBcc()和Zend_Mail :: addCc()可以接收一封电子邮件或一组电子邮件。 addBcc(array(email@one.com, email@two.com)); addCc(array(email@one.com, email@two.com)); Zend_Mail::addBcc() and Zend_Mail::addCc() can take a single email or an array of emails. addBcc(array(em ...
-
事实证明,我在\ Zend \ Mail \ Header组件中找到了一个问题。 我正在使用基于Linux的机器来托管我的php机器,这意味着电子邮件中的每个标题行只应附加“\ r”。 对于Windows,它是“\ r \ n”。 \ Zend \ Mail \ Header文件中的常量EOL被设置为“\ r \ n”,如果从linux机器发送的话,所有头文件将出现在电子邮件中。 这里的最佳做法是使用自动检测平台并使用正确行结束代码的PHP_EOL常量。 解决这个问题: 您需要将您的\ Zend \ Mai ...
-
它正在返回HTML,因为它使用quoted-printable编码对其进行编码,这是在邮件消息中实际发送内容的方式。 如果您想获得没有编码的内容,可以试试这个: $part = $mail->getBodyHtml(); // returns Zend_Mime_Part if ($part !== false && $part instanceof Zend_Mime_Part) { $html = $part->getRawContent(); // returns the raw, une ...
-
当邮件通过其他域发送时, Google会在Gmail中显示“通过”信息。 在您的情况下,邮件来自mydomain.com域中的地址,但邮件服务器位于onlinehome-server.com域中。 您可以通过SMTP服务器为mydomain.com域发送邮件来避免这种情况(假设您的托管服务提供商不阻止此类流量)。 如果可以控制onlinehome-server.com服务器的DNS和邮件服务器配置,您还可以配置SPF和DKIM,如Google的文档中所述(但根据您的托管环境,这可能不是一个选项)。 Goog ...
-
如果要为from属性设置默认电子邮件地址,可以使用setDefaultFrom()静态方法,如下所示: 例如,在你的boostrap中: protected function _initFromMail(){ // You can get the mail from an init file Zend_Mail::setDefaultFrom('emailId1@gmail.com', 'Site Name'); } 在您的功能中,来自地址的邮件会自动填写。 public function ...