socket通讯

Posted xiongyungang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket通讯相关的知识,希望对你有一定的参考价值。

服务端

   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通讯的主要内容,如果未能解决你的问题,请参考以下文章

Android轻量级Socket通讯框架

Socket通讯探索-socket集群

python实现socket通讯 TCP

socket 即时通讯

Unity3D网络通讯--Socket通讯之Tcp通讯

python socket简单通讯