[Erlang 0075] Bad value on output port 'tcp_inet'

简介:
 小超同学遇到一个问题:gen_tcp:send方法报错, Bad value on output port 'tcp_inet';按照字面意思是发往port的数据值是bad value;
 
打开erl5.9\lib\kernel-2.15\src\gen_tcp.erl看一下gen_tcp的源码:
 
复制代码
%%
%% Send
%%

-spec send(Socket, Packet) -> ok | {error, Reason} when
      Socket :: socket(),
      Packet :: iodata(),    %%% <- 注意这里
      Reason :: inet:posix().

send(S, Packet) when is_port(S) ->
    case inet_db:lookup_socket(S) of
     {ok, Mod} ->
         Mod:send(S, Packet);
     Error ->
         Error
    end.
复制代码

 

 从函数接口说明可以看出数据要求是iodata,估计出现'bad value'很有可能数据不是iodata,做个实验看看:

复制代码
Eshell V5.9  (abort with ^G)
1>  {ok,S0}=gen_tcp:listen(5678,[]).
{ok,#Port<0.506>}
2> {ok,S1}=gen_tcp:connect("localhost",5678,[]).
{ok,#Port<0.517>}
3> {ok,S2}=gen_tcp:accept(S0).
{ok,#Port<0.518>}
4> gen_tcp:send(S1,"message text\0").
ok
5> gen_tcp:send(S1,["message text",0]).
ok
6> gen_tcp:send(S1,["message text我们",0]).
ok
7> flush().
Shell got {tcp,#Port<0.518>,[109,101,115,115,97,103,101,32,116,101,120,116,0]}
Shell got {tcp,#Port<0.518>,[109,101,115,115,97,103,101,32,116,101,120,116,0]}
Shell got {tcp,#Port<0.518>,
               [109,101,115,115,97,103,101,32,116,101,120,116,206,210,195,199,
                0]}
ok
8> gen_tcp:send(S1,["message text我们",msg,0]).
{error,einval}

=ERROR REPORT==== 23-Aug-2012::11:37:23 ===
Bad value on output port 'tcp_inet'

9> gen_tcp:send(S1,["message text我们",0]).
ok
10> gen_tcp:send(S1,["message text我们",12,0]).
ok
11> gen_tcp:send(S1,["message text我们",1222,0]).
{error,einval}

=ERROR REPORT==== 23-Aug-2012::11:57:24 ===
Bad value on output port 'tcp_inet'

12>
复制代码

 

重现了小超遇到的问题,,只要发送的数据不是iodata就会报Bad value on output port 'tcp_inet'的错误,根据这个线索,小超同学跟了一下果然由于协议层代码问题导致发送的数据是error_protocol这样一个原子.

 

关于iodata和iolist这个我之前整理过一篇文章[链接],这里只把iodata的定义再贴一遍:

iodata() = iolist() | binary()
iolist() maybe_improper_list(char() | binary() | iolist(), binary() | [])
maybe_improper_list() maybe_improper_list(any(), any())
byte() 0..255
char() 0..16#10ffffmaybe_improper_list(T) maybe_improper_list(T, any())

或者:

IoData = unicode:chardata()
chardata() = charlist() | unicode_binary()
charlist() = [unicode_char() | unicode_binary() | charlist()]
unicode_binary() = binary()

A binary() with characters encoded in the UTF-8 coding standard.

  

 下面资料遇到的情况是同样的原因:

 [1] http://www.trapexit.org/forum/viewtopic.php?p=39602&sid=ba065c1a5b0c789b4383501784d416ec

 [2] http://erlang.org/pipermail/erlang-questions/2009-September/046396.html

 

小图一张

 

目录
相关文章
|
缓存 Java Go
解决Spring Data JPA查询存在缓存问题及解决方案
解决Spring Data JPA查询存在缓存问题及解决方案
1019 0
|
Oracle 关系型数据库 中间件
|
存储 安全 区块链
智能合约开发中13种最常见的漏洞
智能合约开发中13种最常见的漏洞
1098 5
|
开发框架 Java .NET
工作这么多年了,我为什么还在考证
毕业以来参加工作后,一直以来认为考证没有啥用处。一方面,因为找工作太过顺利,那会儿找工作也没有看到别人拿什么证去找工作,也没有看到那家公司的招聘广告上写需要什么什么证书。另一方面,由于才从学校出来对于学习考试有种天然的排斥。想想这么多年以来一直都是在学习考试。好不容易毕业了那还不好好放松一下。现在回想起来真是too young,too simple!
303 1
|
Java 关系型数据库 MySQL
Flink CDC编译问题之编译impala失败如何解决
Flink CDC编译指的是将Flink CDC源代码转换成可执行程序的过程,可能会涉及到依赖管理和环境配置等问题;本合集将介绍Flink CDC编译的步骤、常见错误及其解决办法,以确保顺利完成编译过程。
|
监控 安全 Java
采用UWB定位技术开发的智慧工厂人员定位系统源码
技术架构:Java+ vue+ spring boot 系统概述: 智慧工厂人员定位系统源码,采用UWB定位技术,通过在厂区内布设一定数量的定位基站,实时精确地定位员工、车辆、物品上微标签位置,零延时地将人、车、物的位置信息显示在工厂控制中心,进行安全区域管控、人员在岗监控、车辆实时轨迹监控。UWB定位技术精度可达到厘米级,借助摄像头可实现视频联动功能,实时查看工厂内各个员工的实时面面。
154 0
采用UWB定位技术开发的智慧工厂人员定位系统源码
|
监控 druid 前端开发
整合基本 JDBC 与数据源|学习笔记
快速学习整合基本 JDBC 与数据源
|
Linux 网络安全
linux expect自动登录ssh,ftp
原文出自张映,大牛一个 http://blog.51yip.com/linux/1462.html
1042 0