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

  • 相关阅读:
    Java.io.outputstream.PrintStream:打印流
    Codeforces 732F. Tourist Reform (Tarjan缩点)
    退役了
    POJ 3281 Dining (最大流)
    Light oj 1233
    Light oj 1125
    HDU 5521 Meeting (最短路)
    Light oj 1095
    Light oj 1044
    HDU 3549 Flow Problem (dinic模版 && isap模版)
  • 原文地址:https://www.cnblogs.com/caixu/p/1929915.html
Copyright © 2011-2022 走看看