您的位置:首页 > 其它

API SOCKET基础(二) UDP通信

2012-05-09 15:45 190 查看
UDP是不面向连接的通信,通信过程如下:

首先链接导入库文件,包含头文件,加载套接字库。

服务端:

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

客户端:

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

发送和接收数据:

int sendto(

SOCKET s, //发送数据的socket

const char FAR *buf, //要发送数据的buf地址

int len, //要发送数据的buf长度

int flags, //一般设置为0

const struct sockaddr FAR *to, //目的地址结构体指针

int tolen //地址结构体长度

);

int recvfrom(

SOCKET s, //接收数据socket

char FAR* buf, //保存接收数据的buf地址

int len, //保存接收数据的buf长度

int flags, //一般设置为0

struct sockaddr FAR *from, //地址结构体指针,用来保存数据发送端地址信息

int FAR *fromlen //地址结构体长度

);

服务端socket必须绑定IP端口,这样客户端socket才能知道服务端socket的IP端口从而向服务端socket发送数据。

char IPaddr[16]="127.0.0.1";

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(IPaddr);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

int len=sizeof(SOCKADDR);

sendto(sockClient,"data to send",strlen("data to send")+1,0,(SOCKADDR*)&addrSrv,len);

客户端socket不需要绑定IP端口,而让系统随机绑定一个端口。因为服务端socket永远不会先发数据给客户端socket,而在服务端socket recvfrom客户端发来的数据时,recvfrom函数里就有参数能保存发数据来的客户端socket的地址信息。

char pathBuf[100];

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

recvfrom(sockSrv,pathBuf,100,0,(SOCKADDR*)&addrClient,&len);

socket使用完毕后调用closesocket()函数关闭一个socket以回收资源。在程序关闭之前调用WSACleanup函数终止对套接字库的使用,注意必须在App类(应用程序类)的析构函数中调用WSACleanup函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: