linux socket编程示例——UDP
来源:互联网 发布:windows系统安装u盘 编辑:程序博客网 时间:2024/06/06 12:29
在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接。TCP有一种“重传确认”机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送。
相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务。使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可以进行通信(recvfrom函数和sendto函数)了;客户端在用socket()生成一个套接字后就可以向服务端地址发送和接收数据了。
此处需要特别注意:TCP使用的是流套接字(SOCK_STREAM),UDP使用的是数据报套接字(SOCK_DGRAM)
示例:
服务端
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<netdb.h> #include<stdarg.h> #include<string.h> #define SERVER_PORT 8000 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 int main() { /* 创建UDP套接口 */ struct sockaddr_in server_addr; bzero( &server_addr, sizeof( server_addr ) ); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl( INADDR_ANY ); server_addr.sin_port = htons( SERVER_PORT ); /* 创建socket */ int i_serverfd = socket( AF_INET, SOCK_DGRAM, 0 ); if ( i_serverfd == -1 ) { perror("Create Socket Failed:"); exit(1); } /* 绑定套接口 */ if ( -1 == ( bind( i_serverfd, (struct sockaddr*)&server_addr, sizeof( server_addr ) ) ) ) { perror("Server Bind Failed:"); exit(1); } /* 数据传输 */ while(1) { /* 定义一个地址,用于捕获客户端地址 */ struct sockaddr_in client_addr; socklen_t clientaddr_len = sizeof(client_addr); /* 接收数据 */ char psz_buff[BUFFER_SIZE] = {0}; bzero( psz_buff, BUFFER_SIZE ); if ( recvfrom( i_serverfd, psz_buff, sizeof( psz_buff ) - 1, 0, (struct sockaddr*)&client_addr, &clientaddr_len ) == -1 ) { perror("Receive Message Failed:"); exit(1); } printf( "message from client: %s\n", psz_buff ); memset( psz_buff, 0, sizeof( psz_buff ) ); strncpy( psz_buff, "welcome to my workspace", sizeof( psz_buff ) - 1 ); if ( sendto( i_serverfd, psz_buff, strlen( psz_buff ), 0, ( struct sockaddr * )&client_addr, sizeof( client_addr ) ) < 0 ) { perror("Send Message Failed:"); exit(1); } } close( i_serverfd ); return 0; }
客户端:
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<netdb.h> #include<stdarg.h> #include<string.h> #define SERVER_PORT 8000 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 int main() { /* 服务端地址 */ struct sockaddr_in server_addr; bzero( &server_addr, sizeof( server_addr ) ); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); server_addr.sin_port = htons( SERVER_PORT ); /* 创建socket */ int i_clientfd = socket( AF_INET, SOCK_DGRAM, 0 ); if ( i_clientfd < 0 ) { perror("Create Socket Failed:"); exit(1); } char psz_buff[FILE_NAME_MAX_SIZE + 1]; bzero( psz_buff, FILE_NAME_MAX_SIZE + 1 ); printf( "Please Input Message:\n" ); scanf( "%s", psz_buff ); // send message if ( sendto( i_clientfd, psz_buff, strlen( psz_buff ), 0, ( struct sockaddr * )&server_addr, sizeof( server_addr ) ) < 0 ) { perror("Send Message Failed:"); exit(1); } memset( psz_buff, 0, sizeof( psz_buff ) ); socklen_t clientaddr_len = 0; if ( recvfrom( i_clientfd, psz_buff, sizeof( psz_buff ) - 1, 0, (struct sockaddr*)&server_addr, &clientaddr_len ) == -1 ) { perror("Receive Message Failed:"); exit(1); } printf( "message from server: %s\n", psz_buff ); // receive message close(i_clientfd); return 0; }输出:
客户端:
Please Input Message:
111
message from server: welcome to my workspace
服务端:
message from client: 111
0 0
- linux socket编程示例——UDP
- Linux网络编程之Tcp/Udp socket文件传输示例
- Linux网络编程之UDP Socket程序示例
- Linux socket编程:udp
- linux socket 编程示例
- linux socket编程示例
- Socket编程——UDP编程
- Socket网络编程TCP、UDP示例
- TCP/UDP的Socket编程示例
- java TCP&UDP socket编程示例
- linux udp socket编程实例
- Linux 编程之 【socket】 udp
- linux TCP/UDP SOCKET编程
- linux下socket编程(udp)
- Linux之UDP SOCKET 编程
- socket编程——TCP/UDP数据传输
- java socket编程——UDP通信
- socket编程——UDP协议
- eclipse时间,log时间,控制台打印时间
- Android更新进度条
- 印花税下调,今天股市上涨概率很大
- 记事——2015/8/26
- mui
- linux socket编程示例——UDP
- VC连接SQLite3的方法(MFC封装类)
- UITableViewDataSource
- Gephi——如何在geolayout布局下加上地图背景
- VC 编译 设置 代码合集
- 合并链表
- Project facet Java version 1.7 is not supported
- Android中XML解析之XMLPullParser解析
- iOS 导航栏透明 去掉黑线