erlang 与 C++通信

本文介绍了一个使用Erlang实现的简单TCP服务器示例,包括服务器端的监听、接收客户端数据及响应过程。此外,还提供了一个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
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值