UDP——socket通信
来源:互联网 发布:数据库逻辑数据模型 编辑:程序博客网 时间:2024/05/02 00:39
基于UDP(UDP是无连接、不可靠的协议)的socket编程,分为客户端和服务器端
客户端流程如下:
1)创建套接字(socket)
2)和服务器进行通信(sendto,recvfrom)
3)关闭套接字
服务器端的流程如下:
1)创建套接字(socket)
2)将套接字绑定到一个ip地址和端口上(bind)
3)用返回的套接字和客户端进行通信(recvfrom,sendto)
4)关闭套接字
sendto函数:
ssize_t sendto(int sockfd, const void* buf, size_t len, int flags, const struct sockaddr* dest_addr, socket_t addrlen);
sendto往sockfd上写数据,buf和len参数分别指定写缓冲区的位置和大小。dest_addr参数指定接收端的socket地址,addrlen参数指定该地址的长度。flags表示调用方式标志位,一般为0。
recvfrom函数:
ssize_t recvfrom(int sockfd, void* buf, size_t len, int flags, struct sockaddr* src_addr, socket_t* addrlen);
recvfrom读取sockfd上的数据。因为UDP通信没有连接的概念,所以我们每次读取数据都需要获取发送端的socket四肢,即参数src_addr所指的内容。
server端:
/*************************************************************************> File Name: server.c> Author: fucang_zxx> Mail: fucang_zxx@163.com > Created Time: 2016年07月25日 星期一 13时08分53秒 ************************************************************************/#include<stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <arpa/inet.h>#include <netinet/in.h>const int port = 8080;const char* ip = "192.168.64.128";//服务器端的流程如下://1)创建套接字(socket)//2)将套接字绑定到一个本地地址和端口上(bind)//3)用返回的套接字和客户端进行通信(recvfrom)//4)返回,等待另一个客户请求//5)关闭套接字int main(){int ser_sock = socket(AF_INET, SOCK_DGRAM, 0);if(ser_sock < 0){perror("socket");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);if(bind(ser_sock, (struct sockaddr*)&addr, sizeof(addr)) < 0){perror("bind");return 2;}struct sockaddr_in remote;socklen_t len = sizeof(remote);char buf[1024];while(1){memset(buf, '\0', sizeof(buf));ssize_t size = recvfrom(ser_sock, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&remote, &len);if(size < 0){perror("recvfrom");return 3;}buf[size] = '\0';printf("client:# %s\n", buf);printf("server please enter: ");fflush(stdout);size = read(0, buf, sizeof(buf) - 1);if(size < 0){perror("read");return 4;}buf[size - 1] = '\0';sendto(ser_sock, buf, strlen(buf), 0, (struct sockaddr*)&remote, len);}close(ser_sock);return 0;}
client端:
/*************************************************************************> File Name: client.c> Author: fucang_zxx> Mail: fucang_zxx@163.com > Created Time: 2016年07月25日 星期一 13时08分53秒 ************************************************************************/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <arpa/inet.h>#include <netinet/in.h>const int port = 8080;const char* ip = "192.168.64.128";int main(){int clt_sock = socket(AF_INET, SOCK_DGRAM, 0);if(clt_sock < 0){perror("socket");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);socklen_t len = sizeof(addr);//int connect_fd = connect(clt_sock, (struct sockaddr*)&addr, len);char buf[1024];while(1){memset(buf, '\0', sizeof(buf));printf("client please enter: ");fflush(stdout);ssize_t size = read(0, buf, sizeof(buf) - 1); if(size < 0){perror("read");return 2;}buf[size - 1] = '\0';sendto(clt_sock, buf,strlen(buf), 0, (struct sockaddr*)&addr, len);printf("server:# %s\n", buf);size = recvfrom(clt_sock, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&addr, &len);if(size < 0){perror("recvfrom");return 3;}else {buf[size] = '\0';printf("server:# %s\n", buf);}}close(clt_sock);return 0;}
1 0
- UDP——socket通信
- java socket编程——UDP通信
- socket通信---UDP通信
- 通信网络实验——UDP 的socket实现
- socket编程(3)—— UDP协议通信
- Socket通信——TCP、UDP区别总结、使用场景
- socket网络通信(udp)
- socket网络通信(udp)
- mfc socket udp通信
- UDP Socket通信学习
- Socket ( Udp) 通信服务端
- socket (UDP通信)
- socket udp通信
- Socket之UDP通信
- UDP通信socket编程
- socket实现UDP通信
- UDP之socket通信
- Android:Socket UDP通信
- tjut 2222
- 移动页面HTML5自适应手机屏幕宽度
- UVA1583 UVALive3355 Digit Generator
- C++中string和int之间的转换
- 字体设计规范
- UDP——socket通信
- 【JS笔记】页面同时加载多个函数
- MySQL优化小技巧
- windows7_64bit +VMware® Workstation 12 Pro 安装Ubuntu-16.04-desktop-amd64
- poj 1068 Parencodings
- 求给定整数中的最大值
- iptables的ssh临时开启方法
- swift 基础
- Go基础篇之一