您的位置:首页 > 其它

利用套接字实现UDP 通信 小测

2013-12-18 20:33 113 查看
服务器端(接收端)程序:

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;
}
测试结果:先启动接收端,然后启动发送端

接收端开启时:



发送端:



接收端:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: