您的位置:首页 > 理论基础 > 计算机网络

【winsock2】windows网络编程 之 UDP/IP

2014-02-19 20:16 441 查看
说道UDP,大家自然先想到TCP,那我们就先来比较比较着两种的特性!

TCPUDP
应用场合传输数据量大传输数据量小
传输速度
传输可靠性可靠不可靠
连接性面向连接无连接
UDP类型是数据报套接字(SOCK_DGRAM);
服务器的启动流程:socket --> bind -- > sendto/recvform --> closesocket
客户端的启动流程:socket --> sendto/recvfrom --> closesocket
这样看,UDP通信其实比较简单!

服务器

1、套接字初始化

#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
WSADATA
wsa_data;
int
ret = 0;
ret = WSAStartup(MAKEWORD(2,2),&wsa_data);
//初始化正确返回0

2、创建UDP套件字

SOCKADDR_IN
server_addr;
SOCKET
fd_socket;
fd_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//出错则返回 INVALID_SOCKET

3、绑定套接字与IP

SOCKADDR_INserver_addr;
//服务器配置
int port = 3200;
//端口号
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);//端口号范围: 0 ~65535
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY意思是接受所有IP的连接
ret = bind(fd_socket,(SOCKADDR *)&server_addr,sizeof(SOCKADDR)); //绑定ip域socket,出错返回SOCKET_ERROR

4、接收数据

SOCKADDR_IN
client;
int
client_len = 0;
char buff[1024];
memset(buff,0x0,1024);
ret = recvfrom(fd_socket,buff,1024,0,(SOCKADDR *)&client,&client_len);

5、发送数据

char send_buff[512];
memset(send_buff,0x0,512);
ret = sendto(fd_socket,send_buff,strlen(send_buff),0,(SOCKADDR *)&client,client_len);

6、关闭服务器

closesocket(fd_socket);
WSACleanup();

客户端

有上面的流程可以看出,UDP的客户端与服务器只是少了一个绑定操作!

1、套接字初始化

#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

WSADATA
wsa_data;

int
ret = 0;

ret = WSAStartup(MAKEWORD(2,2),&wsa_data);
//初始化正确返回0

2、创建UDP套件字

SOCKADDR_IN
server_addr;

SOCKET
fd_socket;

fd_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//出错则返回 INVALID_SOCKET

3、要连接的服务器配置

SOCKADDR_IN server_addr;
//服务器配置
int port = 3200;
//端口号
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);//端口号范围: 0 ~65535
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

4、接收数据

int
server_len = 0;

char buff[1024];

memset(buff,0x0,1024);

ret = recvfrom(fd_socket,buff,1024,0,(SOCKADDR *)&server_addr,&server_len);

5、发送数据

char send_buff[512];

memset(send_buff,0x0,512);

ret = sendto(fd_socket,send_buff,strlen(send_buff),0,(SOCKADDR *)&server_addr,server_len);

6、关闭服务器

closesocket(fd_socket);

WSACleanup();

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