您的位置:首页 > 编程语言 > C语言/C++

udp通信C++实现的细节

2016-11-03 00:00 357 查看
在windows/linux下有下面结构:

sockaddr结构

struct sockaddr

{

unsignedshort sa_family;/*addressfamily,AF_xxx*/

char sa_data[14];/*14bytesofprotocoladdress*/

};

sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是
AF_INET,代表TCP/IP协议族。

sa_data是14字节
协议地址

此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

sockaddr_in(在netinet/in.h中定义):

1

2

3

4

5

6

7

8

9

10

11

12

13
struct

sockaddr_in


{


short

sin_family;

/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/


unsigned

short

sin_port;

/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/


struct

in_addr sin_addr;

/*IP address in network byte order(Internet address)*/


unsigned

char

sin_zero[8];

/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/


};


(在ws2def.h中定义):

1

2

3

4

5

6

7

8

9

10

11
struct

sockaddr_in


{



#

if

(_WIN32_WINNT<0x0600)



short

sin_family;



#

else

//(_WIN32_WINNT<0x0600)



address_family sin_family;



#endif

//(_WIN32_WINNT<0x0600)



ushort sin_port;



in_addr sin_addr;



char

sin_zero[8];


}


(在WinSock2.h中定义):

1

2

3

4

5

6
struct

sockaddr_in {



short

sin_family;



u_short sin_port;



struct

in_addr sin_addr;



char

sin_zero[8];


};


在linux下:

in_addr结构

1

2

3

4

5
typedef

uint32_t in_addr_t;


struct

in_addr



{



in_addr_t s_addr;



};


在windows下:

1

2

3

4

5

6

7

8
typedef

struct

in_addr


{



union

{



struct

{ unsigned

char

s_b1,s_b2,s_b3,s_b4; } S_un_b;



struct

{ unsigned

short

s_w1,s_w2; } S_un_w;



unsigned

long

S_addr;



}S_un;


}in_addr;


参数说明

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储
端口号(使用网络
字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。

s
in_addr存储IP地址,使用in_addr这个数据结构

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的
结构体
指针也可以指向

sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,

然后用memset函数初始化就可以了memset((char*)&mysock,0,sizeof(mysock));//初始化

sockaddr_in mysock;

memset((char*)&mysock,0,sizeof(mysock));

mysock.sin_family=AF_INET;

mysock.sin_port=htons(1234);//1234是
端口号

mysock.s
in_addr.s_addr=inet_addr("192.168.0.1");

相关函数:inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

简介

WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步
套接字)的启动命令。是Windows下的
网络编程接口软件Winsock1 或 Winsock2 里面的一个命令(Ps:Winsock 是由Unix下的BSD Socket发展而来,是一个与
网络协议无关的编程
接口)。

详细说明

为了在应用程序当中调用任何一个Winsock API
函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的
初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位
字节指明副版本、低位字节指明主版本;
操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket
版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: