写了一个网络聊天软件(Windows版UDP程序)

大家好,我是涛哥。

TCP网络编程是很重要的,那么,你有使用过UDP网络编程吗?部分朋友的第一反应是:UDP不可靠,所以实际很少用。

真的是这样吗?其实不然!对于很多内网通信而言,基本不存在时延和数据丢包的问题,而且有的应用场景要求并不高。

据我所知,在腾讯的QQ后台,就大量使用了UDP通信,而且并没有做应用层的可靠性保证,照样跑得好好的,没问题。

今天,我们以最简单的UDP编程为例,来实战一下网络编程,实现一个简单的聊天软件,你可以基于本文程序进行修改。

图片

涛哥手绘

服务端程序

服务端程序为:


#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") 
 
int main()
{
  WORD wVersionRequested;
  WSADATA wsaData;
  
  wVersionRequested = MAKEWORD(1, 1);
  
  WSAStartup( wVersionRequested, &wsaData );
  
  SOCKET sockSrv=socket(AF_INET, SOCK_DGRAM, 0);
 
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.S_un.S_addr = inet_addr("w.x.y.z"); // 请将w.x.y.z改为实际IP
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(8888);
 
  bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
 
  char recvBuf[100];
  char sendBuf[100];
  char tempBuf[100];
 
  SOCKADDR_IN addrClient;
  int len = sizeof(SOCKADDR);
 
  while(1)
  {
    recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
    sprintf(tempBuf,"%s", recvBuf);
    printf("%s\n", tempBuf);
 
    printf("Please input data:\n");
    gets(sendBuf);
    sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len);
  }
 
  closesocket(sockSrv);
  WSACleanup();
 
  return 0;
}

编译后运行,让服务端程序跑起来。

客户端程序

接下来,我们看客户端程序:


#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") 
 
int main()
{
  WORD wVersionRequested;
  WSADATA wsaData;
  
  wVersionRequested = MAKEWORD(1, 1);
  
  WSAStartup(wVersionRequested, &wsaData);
 
  SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
 
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.S_un.S_addr = inet_addr("w.x.y.z"); // 请将w.x.y.z改为实际IP
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(8888);
 
  char recvBuf[100];
  char sendBuf[100];
  char tempBuf[100];
 
  int len=sizeof(SOCKADDR);
 
  while(1)
  {
    printf("Please input data:\n");
    gets(sendBuf);
    sendto(sockClient, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrSrv, len);
 
    recvfrom(sockClient,recvBuf, 100, 0, (SOCKADDR*)&addrSrv, &len);
    sprintf(tempBuf,"%s", recvBuf);
    printf("%s\n", tempBuf);
  }
 
  closesocket(sockClient);
  WSACleanup();
 
  return 0;
}

编译后运行,让客户端程序跑起来。从结果看,实现了客户端和服务端的通信。强调一下:请注意先运行服务端,再运行客户端。

网络编程心得

对于网络编程新手而言,看到程序运行的结果,看到客户端和服务端的相互通信,已经是非常让人激动的事情了。 

接下来,可以逐步去理解每个过程的含义,查阅每个函数和参数的含义,然后尝试按照自己想要的方式进行修改。

希望有兴趣的朋友多实践,UDP编程很简单,大家可以用本文的例子实际玩一下,如有疑问,欢迎来交流和讨论。

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/121340081
今日推荐