无连接网络通信程序UDP

服务器端

#include <windows.h>
#include <iostream.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32")

#define NO_FLAGS_SET 0

#define PORT (u_short) 44965
#define MAXBUFLEN 256

INT main(VOID)
{
  WSADATA Data;//它存储 被WSAStartup函数调用后返回的 Windows Sockets数据
  SOCKADDR_IN serverSockAddr;//服务器地址,他区分地址和端口号
  SOCKADDR_IN clientSockAddr;//客户端地址
  SOCKET serverSocket;//服务器套接字
  SOCKET clientSocket;//客户端套接字
  int addrLen=sizeof(SOCKADDR_IN);//获得地址长度
  int status;   //获取WSAStartup返回的整数来判断当前各种状态
  int numrcv;  //获取接受数据过程是否有异常。
  char buffer[MAXBUFLEN];//缓冲区
  /* initialize the Windows Socket DLL */
  status=WSAStartup(MAKEWORD(1, 1), &Data);//调用库函数并返回结果
/*初始化Winsock DLL
  if (status != 0)
    cerr << "ERROR: WSAStartup unsuccessful" << endl;//失败

  /* zero the sockaddr_in structure */
  //memset(&serverSockAddr, 0,sizeof(serverSockAddr));
  /* specify the port portion of the address */
  serverSockAddr.sin_port=htons(PORT);//将端口从整形转化成网络字节序并赋值给服务器端//口
  /* specify the address family as Internet */
  serverSockAddr.sin_family=AF_INET;//表明协议类型是TCP/ip协议
  serverSockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  /* specify that the address does not matter */
/*INADDR_ANY 的具体含义是,绑定到0.0.0.0。此时,对所有的地址都将是有效的
serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
  /* create a socket */
  serverSocket=socket(AF_INET, SOCK_DGRAM, 0);//创建服务器套接字
  if (serverSocket == INVALID_SOCKET)
    cerr << "ERROR: socket unsuccessful" << endl;
	int len = sizeof(serverSockAddr);   //获取服务器地址长度
  /* associate the socket with the address */
  bind(serverSocket, (LPSOCKADDR) &serverSockAddr,len);//将套接字与IP地址绑定
  /*if (status == SOCKET_ERROR)
    cerr << "ERROR: bind unsuccessful" << endl; //绑定失败

  /* allow the socket to take connections */
  /*status=listen(serverSocket, 1);
  if (status == SOCKET_ERROR)
    cerr << "ERROR: listen unsuccessful" << endl; //监听失败

  /* accept the connection request when one is received */
  /*clientSocket=accept(serverSocket,
    (LPSOCKADDR) &clientSockAddr,
    &addrLen);*/

  //cout << "Got the connection..." << endl;
  while(1)
  {
numrcv=recvfrom(serverSocket, buffer, MAXBUFLEN, 0,(SOCKADDR*)&clientSockAddr,&len);
//接收从客户端发送过来的数据并返回结果。
    if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
    {
      cout << "Connection terminated." << endl;
      status=closesocket(clientSocket);
      if (status == SOCKET_ERROR)
        cerr << "ERROR: closesocket unsuccessful"
          << endl;
      status=WSACleanup();
      if (status == SOCKET_ERROR)
        cerr << "ERROR: WSACleanup unsuccessful" 
          << endl;
      return(1); 
    }
    cout << buffer << endl;
  } /* while */
}

客户端如下:

#include <windows.h>
#include <iostream.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32")

#define NO_FLAGS_SET 0

#define PORT (u_short) 44965
#define DEST_IP_ADDR "10.86.2.1" //Server address

INT main(VOID)
{
  WSADATA Data;//它存储 被WSAStartup函数调用后返回的 Windows Sockets数据
  SOCKADDR_IN destSockAddr;//目的套接字地址,他区分地址和端口号
  SOCKET client;//客户端套接字
  int status;//获取WSAStartup返回的整数来判断当前各种状态
  int numsnt; //获取发送数据过程是否有异常。
  char *toSendtxt="Test String";

  /* initialize the Windows Socket DLL */
  status=WSAStartup(MAKEWORD(1, 1), &Data);//调用外部库函数并返回结果
  /*if (status != 0)
    cerr << "ERROR: WSAStartup unsuccessful"//调用失败
      << endl;

  /* convert IP address into in_addr form */
  //destAddr=inet_addr(DEST_IP_ADDR);
  /* copy destAddr into sockaddr_in structure */
  /*memcpy(&destSockAddr.sin_addr,
    &destAddr, sizeof(destAddr));
  /* specify the port portion of the address */
  destSockAddr.sin_port=htons(PORT); //将端口从整形转化成网络字节序并赋值给目的套接//字端
  /* specify the address family as Internet */
  destSockAddr.sin_family=AF_INET;//表明协议类型是TCP/IP协议
  destSockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//设置服务器端的IP地址
  int len = sizeof(SOCKADDR_IN);
  /* create a socket */
  client=socket(AF_INET, SOCK_DGRAM, 0);//创建一个客户端套接字
  /*if (destSocket == INVALID_SOCKET)
  {
    cerr << "ERROR: socket unsuccessful" << endl;//创建失败
    status=WSACleanup();
    if (status == SOCKET_ERROR)
      cerr << "ERROR: WSACleanup unsuccessful" 
        << endl;
    return(1);
  }

  /*cout << "Trying to connect to IP Address: "
    << DEST_IP_ADDR << endl;

  /* connect to the server */
 
  while(1)
  {
    cout << "Sending..." << endl; //控制台输出Sending...
    numsnt=sendto(client, toSendtxt, strlen(toSendtxt) + 1, NO_FLAGS_SET,
		(const SOCKADDR*)&destSockAddr,len);//发送数据并获取结果,各参数上面有说明
    if (numsnt != (int)strlen(toSendtxt) + 1)
    {
      cout << "Connection terminated" << endl;//连接中断
      status=closesocket(client);      //关闭套接字
      if (status == SOCKET_ERROR)
        cerr << "ERROR: closesocket unsuccessful"//关闭失败
          << endl;
      status=WSACleanup(); //终止调用外部库
      if (status == SOCKET_ERROR)
        cerr << "ERROR: WSACleanup unsuccessful"//终止失败
          << endl;
      return(1);
    }

  /* Wait before sending the message again */
  Sleep(4800); //线程睡眠4.8秒 
 } /* while */
}

小程序制作过程中遇到的问题

做C++socket UDP编程,server端接收的数据不完整,中间参杂十六进制的CDCDCDCD,不知道为何?

解决:

       虽然发送的buffer全是正确的,发送数据的长度也是正确的。接数据的长度不正确,接收的数据不完整,应该是原来数组没有初始化,到时接收数据不完整时,接收数组中就出现了CDCDCDCD。之后我将数组进行初始化赋值一下,问题得到解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值