服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。
#include<WinSock2.h>
#include<stdio.h>
int main()
{
//加载套字节库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return 1;
}
//创建套字节
SOCKET serv_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//绑定套字节
SOCKADDR_IN servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(7015); //端口号
//servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //主机测试地址
//servaddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.102"); //路由中,主机真实地址
servaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(serv_socket,(SOCKADDR*)&servaddr ,sizeof(servaddr));
//接收信息
char RecvBuf[100];
int BufLen = 100;
SOCKADDR_IN SenderAddr; //发送端的地址
int SenderAddrSize = sizeof(SenderAddr);
recvfrom(serv_socket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);
printf("%s :%s\n",RecvBuf,inet_ntoa(SenderAddr.sin_addr));
//-----------------------------------------------
// Close the socket when finished receiving datagrams
printf("Finished receiving. Closing socket.\n");
closesocket(serv_socket);
//-----------------------------------------------
// Clean up and exit.
printf("Exiting.\n");
WSACleanup();
return true;
}
关于INADDR_ANY
用于多IP机器上
比如机器有三个ip -> 192.168.1.1 202.202.202.202 61.1.2.3
如果你serv.sin_addr.s_addr=inet_addr("192.168.1.102"); 然后监听7015端口
这时其他机器只有connect 192.168.1.102:7015才能成功。
connect 202.202.202.202:7015和connect 61.1.2.3:7015都会失败。
如果serv.sin_addr.s_addr=htonl(INADDR_ANY); 的话,无论连接哪个ip都可以连上的。
客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
#include<WinSock2.h>
#include<stdio.h>
int main()
{
//加载套字节库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return 1;
}
//创建套字节
SOCKET send_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//发送信息
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.102"); //接收端的服务器地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7015); //服务器的信息
printf("Sending a datagram to the receiver...\n");
sendto(send_socket,"Hello",strlen("Hello")+1,0, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//---------------------------------------------
// When the application is finished sending, close the socket.
printf("Finished sending. Closing socket.\n");
closesocket(send_socket);
//---------------------------------------------
// Clean up and quit.
printf("Exiting.\n");
WSACleanup();
return true;
}
测试结果:先启动接收端,然后启动发送端
接收端开启时:
发送端:
接收端: