1.服务端
#pragma comment(lib,"ws2_32.lib")//动态链接库
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void main(void)
{
WSADATA wsaData;
SOCKET ReceivingSocket;
SOCKADDR_IN ReceiverAddr;
SOCKADDR_IN SenderAddr;
int SenderAddrSize;
int Port = 5150;
int Ret;
SenderAddrSize = sizeof(SenderAddr);
if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)//使用2.2版本
{
printf("WSAStartup failed with error %d\n", Ret);
return;
}
else
{
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)//检查实际初始化的是否就是2.2版本
{
printf("Error: not winsock 2.2\n");
WSACleanup();
return;
}
}
if((ReceivingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return;
}
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(Port);
ReceiverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if(bind(ReceivingSocket,(SOCKADDR*)&ReceiverAddr,sizeof(ReceiverAddr)) == SOCKET_ERROR)
{
printf("bind failed with error %d\n", WSAGetLastError());
closesocket(ReceivingSocket);
WSACleanup();
return;
}
while(1)
{
char buffer[1024] = "\0";
printf("waiting for message from others ... \n");
if((Ret = recvfrom(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SenderAddr,&SenderAddrSize)) == SOCKET_ERROR)
{/*
int recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen)
s:标识一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式。
from:(可选)指针,指向装有源地址的缓冲区。
fromlen:(可选)指针,指向from缓冲区长度值
*/
printf("Error:recvfrom failed with error %d\n",WSAGetLastError());
closesocket(ReceivingSocket);
WSACleanup();
return;
}
else
{
printf("Received datagram from %s -- %s\n", inet_ntoa(SenderAddr.sin_addr),buffer);
sendto(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SenderAddr,SenderAddrSize);
/*
sendto函数:指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包
sockfd: 套接字
buf: 待发送数据的缓冲区
len: 缓冲区长度
flags:调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式:阻塞
addr:(可选)指针,指向目的套接字的地址
addr:lenaddr所指地址的长度
*/
}
Sleep(500);
}
closesocket(ReceivingSocket);
WSACleanup();
system("pause");
}
2.客户端
#pragma comment(lib,"ws2_32.lib")//动态链接库
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET SendingSocket;
SOCKADDR_IN ReceiverAddr;
int Port = 5150;
int ReceiverAddrSize =sizeof(ReceiverAddr);
if(argc <= 1)
{
printf("USAGE: UDPClinet <receiver IP address>. \n");
system("pause");
return;
}
WSAStartup(MAKEWORD(2,2),&wsaData);
SendingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(Port);
ReceiverAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
while(1)
{
char buffer[1024] = "\0";
printf("Input message\n");
scanf("%s",buffer);
if(strcmp(buffer,"bye") ==0)
break;
if(sendto(SendingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&ReceiverAddr,sizeof(ReceiverAddr))!=SOCKET_ERROR)
{
if(recvfrom(SendingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&ReceiverAddr,&ReceiverAddrSize)!=SOCKET_ERROR)
{
printf("Received from server: %s\n",buffer);
}
}
}
closesocket(SendingSocket);
WSACleanup();
system("pause");
}