1.6 网络编程之 UDP通信

来源:互联网 发布:用户数据报协议 编辑:程序博客网 时间:2024/04/30 22:16
**************************************************
*  本文由小鸟飞飞整理发表 <samboy@sohu.com>   *
* 首发网站:蓝丽网               *
*  其他网站转载请保留以上信息,谢谢!      *
**************************************************

   又是出差,一个半月啊,烦死了。好在终于回来了。要过年了,先在这里给大家拜个早年吧,祝大家新年快乐。

  有一些朋友给我发短信问一 些Socket方面的问题,因为一直出差没时间回复在这里说声报谦,先给大家发一节网络编程的内容吧,希望对朋友们有所帮助。

  网络编 程的主要内容是网络协议,如TCP、UDP、SMTP、POP3等,要想做好网络编程首先要了解这些协议。网络通信主要有两种方式:同步和异步。网络程序 主要有两种程序:发送端和接收端。这里只给大家介绍一下网络编程的基本思路,希望能起到抛砖引玉的作用。

一、UDP通信
   UDP通信属于一种异步通信,发送端的程序发出信息后不论接收端是否收到都将继续执行下面的程序。
  1、初始化DLL:Windows Socket编程用到SocketDLL库,所以在使用之前必须先进行初始化工作。Socket DLL也分为不同的几个版本,需要指定使用的DLL库的版本。


WSADATA wsaData;
WSAStartup(MAKEWORD(1,1), &wsaData); // 第一个参数就是Socket版本号

   2、生成Socket:Socket首先要指定所使用的地址协议,通信协议,UDP通信程序必须指定为SOCK_DGRAM。

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
// Protocol to be used with the socket that is specific to the indicated address family.
//这是MSDN中对第三个参数的说明,不知道怎么解释了。

  3、Bind:这是最重要的一 步,需要将生成的Socket与IP地址和端口号建立对应关系。

SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(3000);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR));
  说明:1) bind函数需要指定IP地址和端口号,IP地址必须是执行这个程序所在的计算机的IP地址,将其设定为INADDR_ANY,系统会自动将计算机的IP 地址填入。端口号是用以区别数据是发给哪个网络程序的,端口号是一个两个字节的整数,应把它设在1024到5000之间的值,若设为0,则由系统自动分配 一个适当的数值。
  2)由于各种计算机的数据读取方式不同(如PC与UNIX系统),所以在指定端口和IP地址时,要把它们从主机次序转换到网 络次序。Htons, Htonl函数实现这种功能。

  4、发送/接收数据:

SOCKADDR_IN sockDest;
sockDest.sin_family = AF_INET;
sockDest.sin_port = htons(3001);
sockDest.sin_addr.S_un.S_addr = inet_addr("192.168.0.36");
char buf[1024];
strcpy(buf, "Hello Internet!");
sendto(s, buf, strlen(buf)+1, 0, (SOCKADDR*)&sockDest, sizeof(SOCKADDR));


SOCKADDR_IN sockFrom;
char buf[1024];
memset(buf, 0, 1024);
int len = sizeof(SOCKADDR);
int x=recvfrom(s, buf, 1024, 0, (SOCKADDR*)&sockFrom, &len);

  说明:inet_addr用于将固定格式的字符串(形如 “192.168.0.36”)转换为一个整数,对应的有inet_ntoa用于将整数转换为“192.168.0.36”形式的字符串。

   5、关闭Socket:closesocket(s);
  6、释放DLL:WSACleanup();

  7、头文 件:winsock2.h、LIB:Ws2_32.lib

SOCKADDR_IN 是输入Internet地址的结构体,可以参考MSDN的说明。
0 0