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

原文地址:https://www.cnblogs.com/caixu/p/1929915.html