C++下实现的Socket传送数组

原创 2008年10月03日 06:24:00

前段时间据说使要做分布式计算,要做这个简单的东西,只知道如何传字符窜,不知道如何传整数,数组,结构体,搞了大半夜才知道:原来很简单.........................................

下面贴出代码。

首先是服务器端:

  1. #include <Winsock2.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream.h>
  5. #define MAXLEN 3 //数组长度
  6. int recvpacket[MAXLEN];
  7. int countdata();
  8. void main()
  9. {
  10.     //socket版本
  11.     WORD wVersion;
  12.     WSADATA wsaData;
  13.     int err;
  14.     wVersion=MAKEWORD(1,1);
  15.     err=WSAStartup(wVersion,&wsaData);
  16.     if(err!=0)
  17.     {
  18.         return;
  19.     }
  20.     if((LOBYTE(wsaData.wVersion)!=1)||(HIBYTE(wsaData.wVersion)!=1))
  21.     {
  22.         WSACleanup();
  23.         return;
  24.     }
  25.     //建立socket
  26.     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
  27.     SOCKADDR_IN addSrv;
  28.     addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  29.     addSrv.sin_family=AF_INET;
  30.     addSrv.sin_port=htons(6161);
  31.     bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//绑定
  32.     listen(sockSrv,5);//监听
  33.     int len=sizeof(SOCKADDR);
  34.     SOCKADDR_IN addClient;
  35.     while(1)
  36.     {
  37.         SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addClient,&len);
  38.         char sendBuf[100];
  39.         sprintf(sendBuf,"你已经成功连接到服务器,请等待...");
  40.         send(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送欢迎消息
  41.         
  42.         recv(sockConn,(char *)&recvpacket,sizeof(recvpacket),0);//接收数组
  43.         
  44.         int myresult=countdata();//计算数组     
  45.         send(sockConn,(char *)&myresult,sizeof(myresult),0);//发送结果
  46.         closesocket(sockConn);      
  47.     }   
  48. }
  49. //计算
  50. int countdata()
  51. {
  52.     int s=0;
  53.     for (int i=0;i<MAXLEN;i++)
  54.     {
  55.         s=s+recvpacket[i];
  56.     }   
  57.     return s;
  58. }

 

写了点注释....应该可以看懂。(char *)&m  m可以是数,结构体,字符。结构体的话,后面是sizeof(m)+2 我对地址 指针很头大......不要问为什么......

 

客户端:

 

  1. #include <Winsock2.h>
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. #include <stdlib.h>
  5. #define MAXLEN 3
  6. int sendpacket[MAXLEN];
  7. void getdata();
  8. void main()
  9. {   
  10.     WORD wVersion;
  11.     WSADATA wsaData;
  12.     int err;
  13.     wVersion=MAKEWORD(1,1);
  14.     err=WSAStartup(wVersion,&wsaData);
  15.     if(err!=0)
  16.     {
  17.         return;
  18.     }
  19.     if((LOBYTE(wsaData.wVersion)!=1)||(HIBYTE(wsaData.wVersion)!=1))
  20.     {
  21.         WSACleanup();
  22.         return;
  23.     }
  24.     SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
  25.     SOCKADDR_IN addSrv;
  26.     addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  27.     addSrv.sin_family=AF_INET;
  28.     addSrv.sin_port=htons(6161);
  29.     connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
  30.     char recvBuf[100];
  31.     recv(sockClient,recvBuf,100,0);
  32.     printf("%s/n",recvBuf);
  33.     
  34.     getdata();
  35.     send(sockClient,(char *)&sendpacket,sizeof(sendpacket),0);
  36.     int myresult;
  37.     recv(sockClient,(char *)&myresult,sizeof(myresult),0);
  38.     cout<<myresult<<endl;
  39.     closesocket(sockClient);
  40.     WSACleanup();
  41. }
  42. void getdata()
  43. {   
  44.     cout<<"请输入"<<MAXLEN<<"个整数:"<<endl;
  45.     for (int i=0;i<MAXLEN;i++)
  46.     {
  47.         cin>>sendpacket[i];
  48.     }
  49. }

 

最后不要忘记加上lib

好了,吃早餐了.................. 

TCP socket发送整形数据(数组,结构体)

使用TCP发送整型等(非字符型)数据时,经常会遇到不能将发送类型转换成const char*的错误。这其实是socket设定的问题,socket设定为只能传送字符型数据。 从read和write的函...
  • tecsai
  • tecsai
  • 2016年12月02日 09:52
  • 1555

C++中使用Socket通信包定义和读取方法

由于TCP/IP协议中,不能携带我们数据的长度,也就是说如果我们发的数据为变长度,接收端收到若干字符后就不知道是不是发送完成了,还是要继续等待,一般来说,VC中的解决方案为发送端和接收端 定义一组共享...
  • e_wsq
  • e_wsq
  • 2013年10月16日 01:30
  • 1549

C++ socket中recv和send机制

利用TCP传递信息时要注意:TCP传输是流的方式:即send 100个字节后对方如果没有及时recv取出, 这时又send 100个字节,则recv有可能接收到两次发送叠加的部分或全部数据,所有在传...
  • riyuedangkong1
  • riyuedangkong1
  • 2016年10月05日 17:24
  • 4275

php和c++socket通讯(基于字节流,二进制)

研究了一下PHP和C++socket通讯,用C++作为服务器端,php作为客户端进行. socket通讯是基于协议的,因此,只要双方协议一致就行. 关于协议的选择:我看过网上大部分协议都是在应用层的协...
  • zouhao619
  • zouhao619
  • 2013年06月03日 21:19
  • 14793

Socket接收字节缓冲区

我们接收Socket字节流数据一般都会定义 如   协议号  长度  内容 这三个...
  • wyd1520
  • wyd1520
  • 2014年04月16日 10:06
  • 4656

关于Socket发送byte数组的问题

最新在测试的时候突发奇想,就想利用先用的资源模拟一个学生端的软件 进行提交数据。跟开发沟通以及抓包后了解了大概的通信的协议 如下如所示 协议中前面四个字节为消息的长度,后面4个字节为消息的类型,...
  • qq744746842
  • qq744746842
  • 2015年03月17日 22:10
  • 4003

C++ Socket通信总结(附C++实现)

原文地址:http://blog.csdn.net/linghu_java/article/details/43488919 因为项目需要,服务端需要一个SOCKET来接收客户端的请求,好吧,没...
  • AlphaGQ
  • AlphaGQ
  • 2017年02月06日 21:35
  • 4164

C++客户端和java服务端互相加解密

这段时间在公司做一个APP和移动网关通信加密的项目,本来是想采用https或者openssl来加密通道,但考虑到数据本身的安全性问题,还是打算自己编写加解密算法。 一、流程 1、客户端生成AES密...
  • woaitingting1985
  • woaitingting1985
  • 2018年01月10日 16:07
  • 64

Linux/Window下socket

在Linux中,一切都是文件,除了文本文件、源文件、二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件。例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout...
  • qq_23930393
  • qq_23930393
  • 2016年09月11日 11:55
  • 337

关于serverSocket和clientSocket文件传输

/////////////////////////serverSocket部分//////////////////////////////////////using System;using Syst...
  • ydp_00769
  • ydp_00769
  • 2006年09月04日 15:41
  • 1073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++下实现的Socket传送数组
举报原因:
原因补充:

(最多只允许输入30个字)