• 【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具体原理。

  • 相关阅读:
    【java基础操作】
    IDEA使用总结
    【Linus安装Jenkins】
    【Linus安装Docker】
    【Linus搭建Harbor环境】
    Markdown
    【Python】01.环境搭建
    【01-自动化测试环境搭建】
    【MongoDB入门】
    java语言程序设计 **10.25 第十章练习题 string类中split函数实现
  • 原文地址:https://www.cnblogs.com/caixu/p/1929915.html
Copyright © 2020-2023  润新知