码迷,mamicode.com
首页 > 其他好文 > 详细

socket通讯

时间:2019-07-01 00:31:45      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:ret   tla   返回   fail   break   退出   进入   状态   长度   

服务端

   WORD wVersionRequested;
    WSADATA wsaData;

    //  初始化socket
    wVersionRequested = MAKEWORD(2, 2);
    if(0 != WSAStartup(wVersionRequested, &wsaData))
    {
        printf("WSAStartup Failed \n");
        printf("WSAStartup Error = %d \n", WSAGetLastError());
        return 1; //  代表失败
    }

    /**
     *  AF_INET 地址族,使用IP(Internet procotl)协议
     *  SOCK_STREAM 使用TCP
     *  最后一个参数指定协议,6是TCP ,17UDP
     */
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //  成功返回socket ID,失败返回INVALID_SOCKET
    if (s == INVALID_SOCKET)
    {
      printf("Failed socket\n");
      printf("Socket Error = %d\n", WSAGetLastError()); //  返回错误号
      return -1;
    }
    else
    {
      printf("创建用于监听的套接口,套接口号:[%u]\n", s); 
    }


    //  绑定使用bind()
    struct sockaddr_in Sadd; //  描述本机的端口和IP地址;
    Sadd.sin_family = AF_INET; //  AF_INET 地址族,使用IP(Internet procotl)协议
    Sadd.sin_port = htons(5555); //  端口号,字节序转换函数,把给定系统所采用的字节序称为主机字节序;为了避免不同主机之间的交换数据时对字节序解释不同而导致错误
    Sadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//地址转换函数,返回 32 位地址;
    if (SOCKET_ERROR == bind(s, (sockaddr*)&Sadd, sizeof(Sadd))) //  如果错误返回SOCKET_ERROR
    {
      closesocket(s);       
      return WSAGetLastError();
    }
    else
    {
      printf("绑定成功\n");
      printf("本地Ip地址:[%s],本地端口号:[%u]\n", inet_ntoa(Sadd.sin_addr), ntohs(Sadd.sin_port));
    }
    //监听状态
    if (SOCKET_ERROR == listen(s, 2))  //int status = listen(socket_id,3) 3指定了正在等待连接的最大队列长度
    {
      printf("Failed listen()\n");
      printf("listen Error=%d\n", WSAGetLastError());
    }
    //循环接受客户的连接请求
    struct sockaddr_in Cadd;
    int caddLen = sizeof(Cadd);
    SOCKET c;
    while (TRUE)
    {
      printf("进入监听状态.....\n\n");
      c = accept(s, (sockaddr*)& Cadd, &caddLen); // SOCKET child_sock = accept(socket_id,(struct sockaddr_in*)client_addr,sizeof(child_addr));if error 返回INVALID_SOCKET
      if (c == INVALID_SOCKET)
      {
        printf("Failed accept()\n");
        printf("accept Error=%d\n", WSAGetLastError());
      }
      else
        printf("可以在套接口[%u]上发送接收数据了!\n", c);
      //开始发送、接收 注意都要在新套接口c上进行
      //结束发送、接收
      char buffer[32];
      recv(c, buffer, 32, 0);
      printf("%s\n",buffer);
      closesocket(c);
      printf("与主机IP地址是:[%s]\n|端口号是:[%u]的连接完毕\n", inet_ntoa(Cadd.sin_addr), ntohs(Cadd.sin_port));
      char xx;
      printf("\n需要退出吗?(Y\n)");
      scanf("%c", &xx);
      if (xx == 'Y' || xx == 'y')
      {
        break;
      }
    }
    closesocket(s);
    WSACleanup(); //  结束之前,调用WSACleanup()
    return 0;

客户端

 WORD wVersionRequested;
  WSADATA wsaData;
  int err;

  //初始化socket资源
  wVersionRequested = MAKEWORD(2, 2);
  err = WSAStartup(wVersionRequested, &wsaData);
  if(err != 0)
  {
    printf("WSAStartup Failed\n");
    printf("WSAStartup Error=%d\n", WSAGetLastError());
    return 1;  
  }

  //创建用于监听的流式套接口s,使用socket()
  //AF_INET决定了要用ipv4地址
  //SOCK_STREAM流式Socket
  SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s == INVALID_SOCKET)
  {
    printf("Failed socket\n");
    printf("socket Error=%d\n", WSAGetLastError());
  }
  else
    printf("已创建用于监听的套接口,套接口号:[%u]\n", s);

  //本地地址bind(可以不做这部分,如果不绑定,系统将自动分配)
  struct sockaddr_in Cadd;
  Cadd.sin_family=AF_INET;
  Cadd.sin_port=htons(4444);
  Cadd.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  if (bind(s,(sockaddr*)&Cadd,sizeof(Cadd))==SOCKET_ERROR)
  {
    printf("Failed bind()/n");
  }

  //要连接的服务器地址信息
  struct sockaddr_in Sadd;
  Sadd.sin_family = AF_INET;
  Sadd.sin_port = htons(5555);
  Sadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  //将套接口s与远程主机相连
  if (connect(s, (sockaddr*)& Sadd, sizeof(Sadd)) == INVALID_SOCKET)
  {
    printf("Failed connect()\n");
    printf("connect Error=%d\n", WSAGetLastError());
  }
  else
  {
    //开始发接数据
    printf("连接成功,可以开始发送接收数据了!\n");
    printf("服务器IP地址:[%s]\n 端口号:[%u]\n", inet_ntoa(Sadd.sin_addr), ntohs(Sadd.sin_port));
    send(s,"hello",strlen("hello")+1,0);
    //结束发接数据
  }
  //关闭套接字s,终止对动态链接库的访问
  closesocket(s);
  printf("连接完毕\n");
  WSACleanup();
  return 0;

socket通讯

标签:ret   tla   返回   fail   break   退出   进入   状态   长度   

原文地址:https://www.cnblogs.com/xiongyungang/p/11111778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!