erlang 与 C++通信

%%ser.erl
-module(ser).
-export([server/0,start/2,stop/1]).
-behaviour(application).

%%数字类型
-define( UINT, 32/unsigned-little-integer).
-define( INT, 32/signed-little-integer).
-define( USHORT, 16/unsigned-little-integer).
-define( SHORT, 16/signed-little-integer).
-define( UBYTE, 8/unsigned-little-integer).
-define( BYTE, 8/signed-little-integer).


start(_type,Argu) ->
server().

%%启动服务并接受客户端的连接
server() ->
      {ok, LSock} =gen_tcp:listen(5678, [binary, {packet, 0},{active,false}]),
      {ok, Sock} =gen_tcp:accept(LSock),
      {ok, Bin} = do_recv(Sock, []),
      Bin.

stop(S) ->
   void.

do_recv(LSock, []) ->
      case gen_tcp:recv(LSock, 0) of
            %%匹配Len,Cmd,Contain   接收的时候最好不要多接收,否则可能匹配不了,
            %%C++网络通信中,发送字符串会带结束符(sizeof),如果不带,接收的数据后面可能会显示乱码,
            %%当然,你可以手动在字符串后面添加上结束符。
            %%erlang中没字符串概念,全部以ASCII码形式显示,如果有结束符的话,那就等于多了一个字节
            %%(正常是先接收头部的,这里简略了,一次性接收)
            {ok, <<Len:?USHORT,Cmd:?USHORT,Contain:4/binary-unit:8, Rest/binary>>} ->
                  io:format("~p ~p ~p ~p ~n",['recv data:',Len,Cmd,Contain]),
                  %%把收到的内容 发送回去
                  Bd = <<Contain/binary>>,
                  gen_tcp:send(LSock,Bd),
                  do_recv(LSock,[]);
            {error, _} ->
                  {error, []}
      end.


#include <netinet/in.h>      // for sockaddr_in
#include <sys/types.h>      // for socket
#include <sys/socket.h>      // for socket
#include <stdio.h>            // for printf
#include <stdlib.h>            // for exit
#include <string.h>            // for bzero>
#include <sys/time.h>

struct tem{
unsigned short int i;
unsigned short int j;
char p[4] ;
}temp;

int main(){

char buff[255];
struct sockaddr_in ser;

ser.sin_family = AF_INET;
ser.sin_port = htons(5678);
inet_aton("192.168.0.99",&ser.sin_addr);

//
   temp.i = 10001;
temp.j = 20001;
strcpy(temp.p,"test");
int s_cli = socket(AF_INET,SOCK_STREAM,0);
if(!s_cli){
printf("socket init failed!\n");
exit(1);
}

int c_cli = connect(s_cli,(struct sockaddr *)&ser,sizeof(struct sockaddr));
if(c_cli<0){
printf("connect failed!\n");
exit(1);
}

int i = 1;
while(1){
int se_cli = send(s_cli,(void *)&temp,sizeof(temp),0);
if(!se_cli){
printf("send failed!\n");
}
printf("send...\n");
se_cli   = recv(s_cli,(struct temp *)buff,255,0);
buff[se_cli] = NULL;
printf("recv[%d]...:%s data_len:%d..\n",i++,buff,se_cli);
sleep(1);
}
return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值