注册 登录
编程论坛 C++教室

socket发送map的问题

魔城侠客 发布于 2010-03-01 15:26, 2143 次点击
用c++ 的 socket发送map时,在接收端接不到。。
想问下哪位高手知道怎么用socket发送map数据吗?
23 回复
#2
秀痘魔导士2010-03-02 11:29
以下是引用魔城侠客在2010-3-1 15:26:11的发言:

用c++ 的 socket发送map时,在接收端接不到。。
想问下哪位高手知道怎么用socket发送map数据吗?
拆分成byte发送
#3
魔城侠客2010-03-02 12:21
我把map转成char *后发送,但接到是?
如何转成byte?
#4
秀痘魔导士2010-03-02 13:00
以下是引用魔城侠客在2010-3-2 12:21:55的发言:

我把map转成char *后发送,但接到是?
如何转成byte?
map转char之后收到应该是没有问题的,收到是?应该是你代码的问题吧。你用map封装的东西,再发送之前最好转化掉,如果单纯的强制转换,收到后也是不能还原成map的
#5
魔城侠客2010-03-02 14:55
如何将map转化成byte呢?
#6
魔城侠客2010-03-02 15:10
client代码
        map<string,string> myMap;

        myMap.insert(pair<string,string>("abc","abc"));

        send(sClient,(char *)&myMap,sizeof(myMap),0);

server代码
        char *buff = (char *)malloc(126);

        memset(buff,0,126);

        int retVal = recv(s,buff,126,0);

        if(retVal == SOCKET_ERROR || retVal == 0)
        {
            showMsg("recv() failed or client exit!");
            break;
        }

        map<string,string> *mm = (map<string,string> *)buff;



转成mm后,里面的东西就变成?号了...
#7
秀痘魔导士2010-03-02 15:14
你这么不行的,不是基本类型,不能用这种方法 map<string,string> *mm = (map<string,string> *)buff;
编译器根本不知道这种形式的内在组成形式。在这种通信传输中肯定不能用MAP
#8
秀痘魔导士2010-03-02 15:17
以下是引用魔城侠客在2010-3-2 15:10:08的发言:

client代码
        map<string,string> myMap;

        myMap.insert(pair<string,string>("abc","abc"));

        send(sClient,(char *)&myMap,sizeof(myMap),0);

server代码
        char *buff = (char *)ma ...
你把string写成char,发送两次,到server那里再组合起来
#9
魔城侠客2010-03-02 16:27
改成char还是不行,会显示map=[1](...)
#10
秀痘魔导士2010-03-02 17:22
以下是引用魔城侠客在2010-3-2 16:27:43的发言:

改成char还是不行,会显示map=[1](...)
我的意思是,你发出去的时候就是char,不是map,收回的时候也是char,把char转成string,然后按顺序组成map
#11
魔城侠客2010-03-02 17:27
我传送自定义类和结构体就没问题的。。
也是直接转换成自定义类或结构体,但这个map不行。。。
如果按顺序再重新组成map,那就失去意义了。。。
#12
秀痘魔导士2010-03-02 17:31
以下是引用魔城侠客在2010-3-2 17:27:27的发言:

我传送自定义类和结构体就没问题的。。
也是直接转换成自定义类或结构体,但这个map不行。。。
如果按顺序再重新组成map,那就失去意义了。。。
信息传输不可能传输map这种的,map只是用来做一些查找之类的操作,和传输没什么挂钩的吧。你可以在传输前来调整好传输顺序。
#13
秀痘魔导士2010-03-02 17:35
以下是引用魔城侠客在2010-3-2 17:27:27的发言:

我传送自定义类和结构体就没问题的。。
也是直接转换成自定义类或结构体,但这个map不行。。。
如果按顺序再重新组成map,那就失去意义了。。。
我还是不大理解你为什么要传输map
#14
魔城侠客2010-03-02 17:37
那比如c++与flex交互的时候,要采用什么数据结构传输呢?
#15
魔城侠客2010-03-02 17:39
利用socket通信的
#16
秀痘魔导士2010-03-02 17:44
以下是引用魔城侠客在2010-3-2 17:37:16的发言:

那比如c++与flex交互的时候,要采用什么数据结构传输呢?
char
例如下面这个例子

程序代码:
  while(1)
  {
  //接受连接
  sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  printf("Accept connection from %s\n",inet_ntoa(addrClient.sin_addr));
  //接收数据
  int bytes;
  if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR){
  printf("接收数据失败!\n");
  exit(-1);
  }
  buf[bytes]='\0';
  printf("Message from %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);
  //发送数据
  if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR){
  printf("发送数据失败!");
  exit(-1);
  }
  printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf);
  //清理套接字占用的资源
  closesocket(sockConn);
  }
传输的时候是什么没关系,得到之后在转化就可以了
#17
秀痘魔导士2010-03-02 17:44
  char buf[4096];//接收的数据

  char rbuf[100]="成功";//返回的数据
#18
魔城侠客2010-03-03 08:43
这个是传输最基本的数据类型啊。。有可能会传输一些自定义类型的。。或者传很多这样的基本数据类型
貌似一边用map传,接收端用结构体,也是不行。。
#19
秀痘魔导士2010-03-03 08:55
以下是引用魔城侠客在2010-3-3 08:43:33的发言:

这个是传输最基本的数据类型啊。。有可能会传输一些自定义类型的。。或者传很多这样的基本数据类型
貌似一边用map传,接收端用结构体,也是不行。。
肯定是不行的,一般都是用char的
#20
魔城侠客2010-03-03 08:56
char并不一定是字符型的。。char *可以是任何类型的。。
#21
魔城侠客2010-03-03 09:56
c++和flex通信,比如C++我想传一个结构体或是对象,flex能接收吗?
#22
秀痘魔导士2010-03-03 10:44
以下是引用魔城侠客在2010-3-3 09:56:43的发言:

 c++和flex通信,比如C++我想传一个结构体或是对象,flex能接收吗?
我不大清楚flex,通信一般来说都是传byte数组的
#23
秀痘魔导士2010-03-03 10:45
以下是引用魔城侠客在2010-3-3 09:56:43的发言:

 c++和flex通信,比如C++我想传一个结构体或是对象,flex能接收吗?
  1.发送和接收ASCII码用char   
  2.其余的用byte
#24
魔城侠客2010-03-03 16:40
c++与flex之间通信可以用json。。两者都比较方便。。
结构体和自定义类都行。。
我都试过了。。。。
map传不了算了。。。
1