zoukankan      html  css  js  c++  java
  • 【socket编程】一个简单的基于UDP的客户/服务端例子(vs2008)

    这个例子只设计了客户端发送,服务接收信息,无交互功能。代码如下:(写博客时空行等被网页自动忽略,排版与vs2008上略有不同)

    ----------------------------------------------------------------------------

    ************************udp_client.cpp************************

    ----------------------------------------------------------------------------

    //使用方法举例:udp_client 127.0.0.1 8000
    #include <stdio.h>
    #include "winsock2.h"
    #pragma comment(lib, "ws2_32.lib")//加载依赖库(方法二:项目属性-链接器-输入-附加依赖项:填入ws2_32.lib)

    SOCKET udp_socket;
    sockaddr_in udpAddr;
    const int BufLen=1024;
    char SendBuf[BufLen];

    int main(int argc,char** argv)
    {
     WSADATA wsaData;
     long int Addr;
     int Port;
     if(argc!=3){printf("Usage:%s [<IP> <Port>]\n",argv[0]);return 0;}
     Addr=inet_addr(argv[1]);
     Port=atoi(argv[2]);

     WSAStartup(MAKEWORD(2,2), &wsaData);//根据版本通知操作系统,启用SOCKET的DLL库,必须的
     udp_socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//创建socket
     printf("Running in client mode...\n");

     udpAddr.sin_family=AF_INET;
     udpAddr.sin_port=htons(Port);
     udpAddr.sin_addr.s_addr=Addr;
     while(1)//循环发送
     {
      gets_s(SendBuf,BufLen);
      sendto(udp_socket,SendBuf,BufLen,0,(sockaddr*)&udpAddr,sizeof(udpAddr));//往指定IP的指定端口发送数据
     }
     closesocket(udp_socket);//关闭socket
     WSACleanup();   //释放套接字资源;
     return 1;
    }

    ----------------------------------------------------------------------------

    ***********************udp_service.cpp***********************

    ----------------------------------------------------------------------------

    #include <stdio.h>
    #include "winsock2.h"
    #pragma comment(lib, "ws2_32.lib")

    SOCKET udpSocket=INVALID_SOCKET;
    sockaddr_in udpAddr;
    const int BufLen=1024;
    char RecvBuf[BufLen];

    int main()
    {
     WSADATA wsaData;
     int Port=8000;//端口可自己改

     WSAStartup(MAKEWORD(2,2), &wsaData);
     udpSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
     udpAddr.sin_family=AF_INET;
     udpAddr.sin_port=htons(Port);
     printf("Running in service mode...\n");

     bind(udpSocket,(SOCKADDR*)&udpAddr,sizeof(udpAddr));//绑定端口
     int size=sizeof(udpAddr);
     while(1)//循环接收
     {
      if(udpSocket==INVALID_SOCKET){
       Sleep(1000);//等待,为处理端口信息留出时间
       continue;//跳到下一次while,而不是下一行语句
      }
      recvfrom(udpSocket,RecvBuf,BufLen,0,(SOCKADDR*)&udpAddr,&size);//接收信息
      printf("Received:%s\n",RecvBuf);
     }
     closesocket(udpSocket);
     WSACleanup();   //释放套接字资源;
     return 1;
    }

    【点评】可考虑添加功能如下:

             1.实现问答,让客户端与服务端能交流

             2.服务端能同时与多个客户端进行交流

             3.出错处理

    【思考】recvfrom,sendto具体原理。

  • 相关阅读:
    Arduino-原理图标识
    python-垃圾回收机制
    利用浮力测密度
    sys模块-与python解释器交互的模块
    第十一章第二节 功率
    第十一章第一节 功
    类-描述器-把类对象方法转变为属性方式
    H5浏览器播放RTMP直播流
    如何查看某个端口被谁占用
    OBS第三方推流直播教程
  • 原文地址:https://www.cnblogs.com/caixu/p/1929915.html
Copyright © 2011-2022 走看看