这个例子只设计了客户端发送,服务接收信息,无交互功能。代码如下:(写博客时空行等被网页自动忽略,排版与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具体原理。