zoukankan      html  css  js  c++  java
  • Linux网络编程:UDP Socket编程范例

           TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接。TCP有一种“重传确认”机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送。

          而UDP协议是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务。使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可以进行通信(recvfrom函数和sendto函数)了;客户端在用socket()生成一个套接字后就可以向服务端地址发送和接收数据了。

          注意:TCP使用的是流套接字(SOCK_STREAM),UDP使用的是数据报套接字(SOCK_DGRAM


         UDP套接字编程范例:

    /*************************************************************************
        > File Name: server.c
        > Author: SongLee
        > E-mail: lisong.shine@qq.com
        > Created Time: 2014年05月11日 星期日 19时55分49秒
        > Personal Blog: http://songlee24.github.io
     ************************************************************************/
    #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 server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    	if(server_socket_fd == -1)
    	{
    		perror("Create Socket Failed:");
    		exit(1);
    	}
    
    	/* 绑定套接口 */
    	if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
    	{
    		perror("Server Bind Failed:");
    		exit(1);
    	}
    
    	/* 数据传输 */
    	while(1)
    	{	
    		/* 定义一个地址,用于捕获客户端地址 */
    		struct sockaddr_in client_addr;
    		socklen_t client_addr_length = sizeof(client_addr);
    
    		/* 接收数据 */
    		char buffer[BUFFER_SIZE];
    		bzero(buffer, BUFFER_SIZE);
    		if(recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length) == -1)
    		{
    			perror("Receive Data Failed:");
    			exit(1);
    		}
    
    		/* 从buffer中拷贝出file_name */
    		char file_name[FILE_NAME_MAX_SIZE+1];
    		bzero(file_name,FILE_NAME_MAX_SIZE+1);
    		strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
    		printf("%s
    ", file_name);
    	}
    	close(server_socket_fd);
    	return 0;
    }

    /*************************************************************************
        > File Name: client.c
        > Author: SongLee
        > E-mail: lisong.shine@qq.com
        > Created Time: 2014年05月11日 星期日 21时53分39秒
        > Personal Blog: http://songlee24.github.io
     ************************************************************************/
    #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 client_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    	if(client_socket_fd < 0)
    	{
    		perror("Create Socket Failed:");
    		exit(1);
    	}
    
    	/* 输入文件名到缓冲区 */
    	char file_name[FILE_NAME_MAX_SIZE+1];
    	bzero(file_name, FILE_NAME_MAX_SIZE+1);
    	printf("Please Input File Name On Server:	");
    	scanf("%s", file_name);
    
    	char buffer[BUFFER_SIZE];
    	bzero(buffer, BUFFER_SIZE);
    	strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
    
    	/* 发送文件名 */
    	if(sendto(client_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
    	{
    		perror("Send File Name Failed:");
    		exit(1);
    	}
    
    	close(client_socket_fd);
    	return 0;
    }

    注意和TCP工作流程对比: Linux网络编程:socket文件传输范例



  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/songlee/p/5738149.html
Copyright © 2011-2022 走看看