windows下網絡編程UDP


轉載

C++ UDP客戶端服務器Socket編程

UDPServer.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define BUFFER_SIZE 1024
int main()
{
  WSADATA WSAData;
  char receBuf[BUFFER_SIZE];
  char Response[] = "";
  if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
  {
    printf("初始化失敗");
    exit(1);
  }
  SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (sockServer == INVALID_SOCKET)
  {
    printf("Failed socket() \n");
    return 0;
  }
  SOCKADDR_IN addr_Server; //服務器的地址等信息
  addr_Server.sin_family = AF_INET;
  addr_Server.sin_port = htons(4567);
  addr_Server.sin_addr.S_un.S_addr = INADDR_ANY;
  if (bind(sockServer, (SOCKADDR*)&addr_Server, sizeof(addr_Server)) == SOCKET_ERROR)
  {
    //服務器與本地地址綁定
    printf("Failed socket() %d \n", WSAGetLastError());
    return 0;
  }
  SOCKADDR_IN addr_Clt;
  int fromlen = sizeof(SOCKADDR);
  while (true)
  {
    int last = recvfrom(sockServer, receBuf, 1024, 0, (SOCKADDR*)&addr_Clt, &fromlen);
    if (last>0)
    { 
      //判斷接收到的數據是否為空
      receBuf[last] = '\0';//給字符數組加一個'\0',表示結束了。不然輸出有亂碼
      if (strcmp(receBuf, "bye") == 0)
      {
        cout << " 客戶端不跟我聊天了..." << endl;
        closesocket(sockServer);
        return 0;
      }
      else
      {
        printf("接收到數據(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf);
      }
    }
    cout << "回復客戶端消息:";
    cin >> Response; //給客戶端回復消息
    sendto(sockServer, Response, strlen(Response), 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR));
  }
  closesocket(sockServer);
  WSACleanup();
  return 0;
}

UDPClient.cpp

 #include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
# define BUFFER_SIZE 1024 //緩沖區大小
int main()
{
  SOCKET sock_Client; //客戶端用於通信的Socket
  WSADATA WSAData;
  char receBuf[BUFFER_SIZE]; //發送數據的緩沖區
  char sendBuf[BUFFER_SIZE]; //接受數據的緩沖區
  if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
  {
    printf("初始化失敗!");
    return -1;
  } 
   //初始化
  sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//創建客戶端用於通信的Socket
  SOCKADDR_IN addr_server; //服務器的地址數據結構
  addr_server.sin_family = AF_INET;
  addr_server.sin_port = htons(4567);//端口號為4567
  addr_server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //127.0.0.1為本電腦IP地址
  SOCKADDR_IN sock;
  int len = sizeof(sock);
  while (true)
  {
    cout << "請輸入要傳送的數據:";
    cin >> sendBuf;
    sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR));
    //int last=recv(sock_Client, receBuf, strlen(receBuf), 0); // (調用recv和recvfrom都可以)
    int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len);
    if (last>0)
    {
      receBuf[last] = '\0'; //給字符數組加一個'\0',表示結束了。不然輸出有亂碼
      if (strcmp(receBuf, "bye") == 0)
      {
        cout << "服務器不跟我聊天了..." << endl;//當服務器發來bye時,關閉socket
        closesocket(sock_Client);
        break;
      }
      else
      {
        printf("接收到數據:%s\n", receBuf);
      }
    }
  }
  closesocket(sock_Client);
  WSACleanup();

  return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM