c++ Socket传输

服务端-监听接收

#include "winsock2.h"
#pragma     comment(lib,"WS2_32.LIB")

int bufi;

class mserver{

private:
      SOCKET ssock,csock;
      sockaddr_in saddr,caddr;
      int len;
      char buf[4096];

public:
      mserver(){

      }
      mserver(int port,int maxclient){
          saddr.sin_family=AF_INET;
          saddr.sin_port=htons(port);
          saddr.sin_addr.s_addr=INADDR_ANY;
          ssock=socket(AF_INET,SOCK_STREAM,0);
          if(ssock==INVALID_SOCKET){
              printf("build socket error\n");
          }
          if(bind(ssock,(struct sockaddr*)&saddr,sizeof(saddr))==SOCKET_ERROR){
              printf("socket bind fail\n");
          }
          len=sizeof(caddr);
      }

      void close(){
          closesocket(ssock);
          closesocket(csock);
      }

      void beginlisten(){
          if(listen(ssock,10)==SOCKET_ERROR){
              printf("listen fail\n");
          }
      }

      void maccept(){
          sockaddr a;
          csock=accept(ssock,(struct sockaddr*)&caddr,&len);
          if(csock==INVALID_SOCKET){
              printf("accept fail : %d\n",WSAGetLastError());

          }
          printf("client from %s connected\n",inet_ntoa(caddr.sin_addr));
      }

      int receive(){
          memset(buf,0,4096);
          if(recv(csock,buf,4096,0)==SOCKET_ERROR){
              return 0;
          }
          printf("message received : %s\n",buf);
          send(csock,buf,4096,0);
          return 1;
      }

};

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;
      if (WSAStartup(MAKEWORD(2,1),&wsaData)){
           printf("Winsock initializing fail\n");
           WSACleanup();
           return 0;
      }
      mserver server(12345,10);
      server.beginlisten();
      server.maccept();
      while(server.receive());
      server.close();
      WSACleanup();
      return 0;

}

客户端发送数据

#include "winsock2.h"
#pragma     comment(lib,"WS2_32.LIB")

class mclient{
private:
      SOCKET sock;
      sockaddr_in saddr;
      int len;
      char buf[4096];
public:
      mclient(){
          sock=socket(AF_INET,SOCK_STREAM,0);
          len=sizeof(saddr);
      }

      bool mconnect(char* addr,int port){
          saddr.sin_family=AF_INET;
          saddr.sin_port=htons(port);
          saddr.sin_addr.s_addr=inet_addr(addr);
          if(connect(sock,(struct sockaddr*)&saddr,len)==SOCKET_ERROR){
              printf("connect fail : %d",WSAGetLastError());
              return false;
          }
          return true;
      }

      void close(){
          closesocket(sock);
      }

      void msend(char* mes){
          send(sock,mes,strlen(mes),0);
      }

      bool receive(){
          memset(buf,0,4096);
          if(recv(sock,buf,4096,0)==SOCKET_ERROR){
              return false;
          }
          else{
              printf("received from server : %s\n",buf);
              return true;
          }
      }

};

int main()
{
    while(1){
      WSADATA wsaData;
      if (WSAStartup(MAKEWORD(2,1),&wsaData)){
           printf("Winsock initializing fail\n");
           WSACleanup();
           return 0;
      }
      mclient a;
      if(!a.mconnect("127.0.0.1",12345)){
          return 0;
      }
      char buf[1024];
      while(scanf("%s",buf)){
          if(strcmp(buf,"quit")==0){
              break;
          }
          a.msend(buf);
          a.receive();

      }
      a.close();
      WSACleanup();
    }
      return 0
}

ps:如果不在同一函数中声明client与server,将会报错。我用了全局变量后在用了函数声明赋值。

c++ Socket传输

时间: 2024-08-29 09:57:34

c++ Socket传输的相关文章

unity探索者之socket传输protobuf字节流(一)

近期在做一个棋牌项目,需要用到socket传输protobuf字节流,在网上找了一些博客和文章后发现,没有特别全面的,所以把自己研究的全部源码拿出来和大家分享,因为刚开始做,可能会有不足的地方,欢迎拍砖~~ 这一篇主要是protocol buffer文件的序列化和解析,废话不多说了,直接上干货 1 /// <summary> 2 /// 将消息序列化为二进制的方法 3 /// </summary> 4 /// <param name="model">

[C#技术参考]Socket传输结构数据

最近在做一个机器人项目,要实时的接收机器人传回的坐标信息,并在客户端显示当前的地图和机器人的位置.当然坐标的回传是用的Socket,用的是C++的结构体表示的坐标信息.但是C#不能像C++那样很easy的把字节数组byte[]直接的转换成结构,来发送和接收.在C#中要多做一些工作.但是在C或者C++中这是一件很容易的事,只需要一个函数: void *memcpy(void *dest, const void *src, size_t n);//从源src所指的内存地址的起始位置开始拷贝n个字节到

C++ socket 传输不同类型数据的四种方式

使用socket传输组织好的不同类型数据,有四种不同的方式(我知道的嘿嘿): a. 结构体 b. Json序列化 c. 类对象 d. protobuf 下面逐一整理一下,方便以后进行项目开发. 1. 使用结构体 假设需要传送的结构体如下: struct person { char name[20]; // 注意:CPU访问内存的时候,对访问地址有对齐的要求,一般为2的幂次方.所以,有的数据被填充,以满足对齐要求. int age; float high; }; 可在发送数据的地方对数据进行处理,

C# Socket传输大文件

1.基础类TransferFiles,client和server都需要 using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Windows.Forms; namespace Server { public class TransferFiles { public static int SendData(

Socket传输结构体数据注意事项

[1 背景] 在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输. 接收端也必须通过同样的结构体进行解析. 但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错:2)接收数据不完整:3)解析为乱码等的Bug. [2 举例] 如下是接收端解析数据为乱码甚至崩溃的一类常见错误. 结构体也就是一段连续的内存. 但是类似如下的结构体: typedef struct _PER_SPIDER_INFO { UINT nTimeDelay;

Java使用Socket传输文件遇到的问题(转)

1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题. 个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误. //---------------------------------------------------------------------------------------------------------

使用Socket传输对象

在使用QT网络通信时一直是简单的发送数据--接收数据,常见的就是发送一个字符串/字节流,然后根据这个字符串/字节流提取出有用的信息. 这样在不是很复杂的通信中可以满足实际需要.但也有弊端,就是每次写网络通信时都是口头约定一个协议,让发送方与接收方都满足这个协议才可以进行正常通信. 这样如果我每次写这样的程序,我都要首先规定好一个的通讯协议,然后再编写相应的代码. 那么如何传输更复杂的数据呢,而且可以不用上述的口头协议? 在JAVA,C#中都有对对象序列化的概念,QT里也有,利用将对象序列化传输可

unity探索者之socket传输protobuf字节流(四)

版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7027659.html 上篇已经把socket的传输说的差不多了,这篇主要是说说断线重连,没什么好说的,直接上代码吧 1 //断线重连功能我是用的协程,不建议用线程去重连,因为大多数时候,重连是需要告诉用户的,使用线程会导致显示很麻烦 2 int reconnectTime = 0;//重连次数 3 IEnumerator Reconnect() 4 { 5 //关闭socket,

Python Socket传输文件

发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一: #-*- coding: UTF-8 -*- import socket,time,SocketServer,struct,os,thread host='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_S