• 使用AF_INET实现点对点的通信示例


    作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

    1.    客户端(发送方)

    操作流如下:

    (1) 使用AF_INET协议簇,创建基于数据报的socket对象;

    (2) 发送方不会在程序中显式的绑定自己的IP信息,但系统会帮助完成这一动作,并指定随机的端口信息,所以接收端显示的端口信息并不会每次都一样;

    (3) 发送端向接收端的7838端口发送数据,然后退出

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    
    int main(int argc, char **argv)
    {
         struct sockaddr_in s_addr;
         int sock, addr_len, len;
         char buff[128];
         if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))
         {
             printf("socket");
             exit(errno);
         }
         else
             printf("create socket.
    ");
    
         s_addr.sin_family = AF_INET;
         s_addr.sin_port = htons(7838);
    
        if(argv[1])
    	{
         	s_addr.sin_addr.s_addr = inet_addr(argv[1]);
        }
        else
        {
         	printf("input server ip!
    ");
            exit(0);
        }
        addr_len = sizeof(s_addr);
    
        strcpy(buff,"hello i am here");
        len = sendto(sock, buff, strlen(buff),
         				0, (struct sockaddr *)&s_addr, addr_len);
        if(len < 0)
    	{
    		printf("
     send error.
    ");
    	    return 3;
    	}
    	printf("send success.
    
    ");
    	
    	return 0;
    }


    2.    服务器端(接收方)

    操作流如下:

    (1) 使用AF_INET协议簇,创建基于数据报的socket对象;

    (2) 绑定自己的IP和端口,此端口也是发送方程序向接收端发起连接时指定的接收端端口;

    (3) 接收端阻塞式接收发送端数据;

    (4) 如果接收到数据,读取数据并处理。

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    
    int main(int argc, char **argv)
    {
    	struct sockaddr_in s_addr, c_addr;
        int sock, len;
        socklen_t addr_len;
        char buff[128];
        if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
        {
        	printf("socket");
        	exit(errno);
        }
        else
        	printf("create socket.
    
    ");
        
        memset(&s_addr, 0, sizeof(struct sockaddr_in));
        
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(7838);
        s_addr.sin_addr.s_addr = INADDR_ANY;
        
        if((bind(sock,(struct sockaddr *)&s_addr, sizeof(s_addr))) == -1)
        {
            printf("bind");
            exit(errno);
        }
        else
        	printf("bind address to socket.
    
    ");
        
        addr_len=sizeof(c_addr);
        while(1) {
        	len = recvfrom(sock, buff, sizeof(buff) - 1,
        			0, (struct sockaddr *)&c_addr, &addr_len);   
            if(len<0)
            {
                printf("recvfrom");
                exit(errno);
            }
        
            buff[len]='';
            printf("recive come from %s:%d message:%s
    
    ",
            	inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);
        }
        
        return 0;
    }
    作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

  • 相关阅读:
    福大软工1816 · 第三次作业
    福大软工1816 · 第二次作业
    2018福大软工第一次作业
    20180823-软工实践第一次作业-自我介绍
    福大软工1816 · 第一次作业
    开博之作 · 简单的自我介绍
    2018软件工程实践第一次作业
    系列最终篇!
    含继承多态思想的四则运算器和简单工厂模式初步
    作业六 栈的使用和界面编程探索
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624560.html
Copyright © 2020-2023  润新知