Udp编程

一.UDP编程流程

(1)服务器(servers):

创建套接字(socket)

绑定IP地址和端口(bind)

收发数据(sendto/recvfrom)

关闭连接(close)

(2)客户端(client):

创建套接字(socket)

收发数据(send/recvfrom)

关闭连接(closesocket)


二.用于收发的函数:

int sendto (
 SOCKET s,//用来发送数据的套接字
 const char FAR * buf,//指向发送数据的缓冲区
 int len,//要发送数据长度
 int flags,//标志,一般为0
 const struct sockaddr FAR *to,//指向一个包含目标地址和端口号的socketadd_in 结构
 int tolen  //socketadd_in 结构的大小
);
相关函数:send , sendmsg

函数原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); ssize_t 相当于 int,socket_t 相当于int ,这里用这个名字为的是提高代码的自说明性。
sockfd:标识一个已连接的描述套接口字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式。是以下一个或者多个标志的组合体,可通过or操作连在一起:
结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.。
相关函数:recv, recvmsg
三.程序
servers:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // UDPServer.cpp文件  
  2. //sock->bind->recvfrom->close  
  3.   
  4. #include "InitSock.h"  
  5. #include <stdio.h>  
  6. CInitSock initSock;     // 初始化Winsock库  
  7.   
  8. int main()  
  9. {  
  10.     // 创建套节字  
  11.     int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  12.     if(s == INVALID_SOCKET)  
  13.     {  
  14.         printf("Failed socket!!!\n");  
  15.         return 0;  
  16.     }  
  17.       
  18.     // 填充sockaddr_in结构  
  19.     sockaddr_in sin;  
  20.     sin.sin_family = AF_INET;  
  21.     sin.sin_port = htons(4567);  
  22.     sin.sin_addr.s_addr = INADDR_ANY;  
  23.       
  24.     // 绑定这个套节字到一个本地地址  
  25.     if(bind(s, (struct sockaddr)&sin, sizeof(sin)) == SOCKET_ERROR)  
  26.     {  
  27.         printf("Failed bind!!!\n");  
  28.         return 0;  
  29.     }  
  30.   
  31.     // 接收数据  
  32.     char buff[1024];  
  33.     sockaddr_in addr;  
  34.     int nLen = sizeof(addr);  
  35.     while(TRUE)  
  36.     {  
  37.         int nRecv = recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);   
  38.         if(nRecv > 0)  
  39.         {  
  40.             buff[nRecv] = '\0';  
  41.             printf(" recv data(%s):%s", inet_ntoa(addr.sin_addr), buff);  
  42.         }  
  43.     }  
  44.     close(s); 
  45. }  
client:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // UDPClient文件  
  2. //sock->sendto->close  
  3.   
  4. #include "InitSock.h"  
  5. #include <stdio.h>  
  6. CInitSock initSock;     // 初始化Winsock库  
  7.   
  8. int main()  
  9. {  
  10.     // 创建套节字  
  11.     int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  12.     if(s == INVALID_SOCKET)  
  13.     {  
  14.         printf("Failed socket!! %d \n", ::WSAGetLastError());  
  15.         return 0;  
  16.     }  
  17.       
  18.     // 也可以在这里调用bind函数绑定一个本地地址  
  19.     // 否则系统将会自动安排  
  20.           
  21.     // 填写远程地址信息  
  22.     sockaddr_in addr;   
  23.     addr.sin_family = AF_INET;  
  24.     addr.sin_port = htons(4567);  
  25.     // 注意,这里要填写服务器程序所在机器的IP地址  
  26.     // 如果你的计算机没有联网,直接使用127.0.0.1即可  
  27.     addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  28.   
  29.     // 发送数据  
  30.     char szText[] = " TCP Server Demo! \r\n";  
  31.     sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));  
  32.   
  33.     close(s);  
  34.     return 0;  
  35. }  

其实UDP面向无连接的程序与TCP面向连接的程序有很大的相似性,但UDP的较为简单些。由于传输并不可靠,因此多用于线路可靠的传输系统中。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值