服务器实现过程:
- 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
- 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
- 3、使用bind函数给socket创建的SOCKET变量绑定一个本地地址
- 4、绑定成功之后就可以等客户机的数据上传或者向指定的客户机发送数据。
客户机实现过程:
- 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
- 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
- 3、创建成功之后就可以向服务器发送数据或者接受服务器发送的数据。
服务器例程实现:
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void main()
{
WSADATA wsaDate;
int Ret;
SOCKET ReceivingSocket;
SOCKADDR_IN ReceiverAddr;
SOCKADDR_IN SendAddr;
int SendAddrLen;
int Prot = 5150;
SendAddrLen = sizeof(SendAddr);
if ((Ret = WSAStartup(MAKEWORD(2,2),&wsaDate)) != 0)
{
printf("WSAStartup failed with error %d\n",Ret);
return;
}
else
{
if (LOBYTE(wsaDate.wVersion) != 2 || HIBYTE(wsaDate.wVersion) != 2)
{
printf("WSAStartup failed with error %d\n", Ret);
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(Prot);
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());
WSACleanup();
closesocket(ReceivingSocket);
return;
}
while (1)
{
char buffer[1024] = "\0";
printf("waiting for messgae from other ... \n");
if ((Ret = recvfrom(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SendAddr,&SendAddrLen))== SOCKET_ERROR )
{
printf("recvfrom failed with error %d\n",WSAGetLastError());
closesocket(ReceivingSocket);
WSACleanup();
return;
}
else
{
printf("Receivd datagram from %s -- %s\n",inet_ntoa(SendAddr.sin_addr),buffer);
sendto(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SendAddr,SendAddrLen);
}
Sleep(500);
}
closesocket(ReceivingSocket);
WSACleanup();
system("pause");
}
客户机例程实现:
#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 ReceiveAddr;
SOCKADDR_IN ReceiveingAddr;
int Port = 5150;
int ReceiveingAddrSize = sizeof(ReceiveingAddr);
WSAStartup(MAKEWORD(2,2),&wsaData);
SendingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (argc<=1)
{
printf("UDPClient < receiver IP addrasa \n");
system("pause");
return;
}
ReceiveAddr.sin_family = AF_INET;
ReceiveAddr.sin_port = htons(Port);
ReceiveAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
while (1)
{
char buffer[1024] = "\0";
printf("Input messgae\n");
scanf("%s",buffer);
if (strcmp(buffer,"bye") == 0)
{
break;
}
if (sendto(SendingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&ReceiveAddr,sizeof(ReceiveAddr))!= SOCKET_ERROR)
{
if (recvfrom(SendingSocket, buffer, sizeof(buffer), 0, (SOCKADDR*)&ReceiveAddr,&ReceiveingAddrSize) != SOCKET_ERROR)
{
printf("Reciver from server : %s\n",buffer);
}
}
}
closesocket(SendingSocket);
WSACleanup();
system("pause");
}