点对点通信程序

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>      //*进程用的头文件*/
#include<netinet/in.h>
#include<arpa/inet.h>

 #define MAXLINE  50  //通信内容的最大长度
int main()
{
    int sock_fd,new_fd;//sock_fd用于监听,new_fd用于连接
    struct sockaddr_in srv_addr;//服务器的地址信息
    struct sockaddr_in client_addr;//客户机的地址信息
    int size; //地址结构数据的长度
    pid_t  pid;  //子进程id
    ssize_t n;
    char buf[MAXLINE]; //用于存放通信的内容

    /*创建套接字*/
    sock_fd=socket(AF_INET,SOCK_STREAM,0);//采用IPv4协议
    if(sock_fd==-1)
    {
        perror("creat socket failed");
        exit(1);
    }

    /*服务器地址参数*/
    srv_addr.sin_family=AF_INET;
    srv_addr.sin_port=htons(3490);
    srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bzero(&srv_addr.sin_zero,sizeof(struct sockaddr_in));//bzero位清零函数,将sin_zero清零,sin_zero为填充字段,必须全部为零

    int on=1; //表示开启reuseaddr
    if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)  //打开地址、端口重用
        perror("setsockopt");

    /*绑定地址和端口*/
    if(bind(sock_fd,(struct sockaddr*)&srv_addr,sizeof(struct sockaddr))==-1)
    {
        perror("bind failed");
        exit(1);
    }

    /*连接到服务器
    if(connect(sock_fd,(struct sockaddr*)&srv_addr,sizeof(sock_fd))==-1)
    {
        perror("bind failed");
        exit(1);
    }*/

    /*设置监听模式,等待客户机的监听*/
    if((listen(sock_fd,5))==-1)
    {
        perror("listen failed");
        exit(1);
    }

    /*接受连接,采用非阻塞是的模式调用accep*/
    //while(1)
    //{
        size=sizeof(struct sockaddr_in);
        new_fd=accept(sock_fd,(struct sockaddr*)&client_addr,&size);
        if(new_fd==-1)
        {
            perror("accept failed");
            //continue;//restart accept when EINTR
        }

        printf("server:got connection from IP= %s prot= %d \n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));//连接成功,打印客户机IP地址和端口号
        /*char *inet_nota(struct sockaddr_in in);
        头文件:
        arpa/inet.h
        Winsock2.h
        参数:
        一个网络上的IP地址
        返回值:
          如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。
        uint31_t ntohs(uint32_t net32bitvalue);
        头文件:
        #include<netinet/in.h>
        把net32bitvalue有网络字节序转换为主机字节序。
        */
        if(send(new_fd,"Hello client,I am 192.168.229.125!\n",50,0)==-1)  //192.168.229.125为子进程IP,可更改
            perror("send failed");

        pid=fork();  //父进程建立套接字的连接之后,创建子进程用于通信
        if(pid<0)
               perror("fork error\n");
        if(!pid)//创建新的子进程,用于发送数据
        {
           // close(sock_fd);//子进程不需要监听,所以子进程关闭监听套接字
            while(fgets(buf,sizeof(buf),stdin)!=NULL)
            {
                write(new_fd,buf,strlen(buf));
                memset(buf,0,sizeof(buf));   //清空,以免和下一次混淆
           // exit(EXIT_SUCCESS);
            }
            exit(EXIT_SUCCESS);
        }
        else   //f=父进程用于接收数据
        {
            char recvbuf[50];
            //close(new_fd);//父进程不需要连接,所以关闭连接套接字
            while(1)
            {
                memset(recvbuf,0,sizeof(recvbuf));
                n=read(new_fd,recvbuf,MAXLINE);
                if(n==0)
                {
                    printf("peer closed\n");
                    break;
                }
                else if(n<0)
                    perror("read from client error");
                 fputs(recvbuf,stdout);
             }
            exit(EXIT_SUCCESS);

        }

        //while(waitpid(-1,NULL,WNOHANG)>0);//等待子进程结束,进行新的连接
    //}
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>      //*进程用的头文件*/
#include<netinet/in.h>
#include<arpa/inet.h>

#define MAXBYTEMUN   50
int main(int argc,char *argv[])
{
    int sock_fd,numbytes;
    char buf[MAXBYTEMUN];
    struct hostent *he;
    struct sockaddr_in client_addr;//客户机的地址信息
    ssize_t n;

    if(argc!=2)
    {
        fprintf(stderr,"usage: client IPAddress\n");   //执行客户端程序时,输入客户端程序名称和其IP地址
        exit(1);
    }

    /*创建套接字*/
    sock_fd=socket(AF_INET,SOCK_STREAM,0);//采用IPv4协议
    if(sock_fd==-1)
    {
        perror("creat socket failed");
        exit(1);
    }

    /*服务器地址参数*/
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(3490);
    client_addr.sin_addr.s_addr=inet_addr(argv[1]);
    bzero(&client_addr.sin_zero,sizeof(struct sockaddr_in));//bzero位清零函数,将sin_zero清零,sin_zero为填充字段,必须全部为零

    /*连接到服务器*/
    if(connect(sock_fd,(struct sockaddr*)&client_addr,sizeof(struct sockaddr))==-1)
    {
        perror("connect failed");
        exit(1);
    }
    if((numbytes=recv(sock_fd,buf,MAXBYTEMUN,0))==-1)
        {
            perror("receive failed");
             exit(1);
        }
    buf[numbytes]=‘\0‘;//在字符串末尾加上\0,否则字符串无法输出
    printf("Received: %s\n",buf);

    pid_t pid;
    pid=fork();
    if(!pid)//创建新的子进程,用于接收数据
        {
            char recvbuf[50];
            while(1)
            {
                memset(recvbuf,0,sizeof(recvbuf));
                n=read(sock_fd,recvbuf,MAXBYTEMUN);
                if(n==0)
                {
                    printf("peer closed\n");
                    break;
                }
                else if(n<0)
                    perror("read from server error");
                  fputs(recvbuf,stdout);
            }
            //exit(EXIT_SUCCESS);
            close(sock_fd);
        }
        else   //f=父进程用于发送数据
        {
            //close(sock_fd);//父进程不需要连接,所以关闭连接套接字
            while(fgets(buf,sizeof(buf),stdin)!=NULL)
            {
                write(sock_fd,buf,strlen(buf));
                memset(buf,0,sizeof(buf));   //清空,以免和下一次混淆
           // exit(EXIT_SUCCESS);
            }
            //exit(EXIT_SUCCESS);
             close(sock_fd);
        }
    /*接受数据
    if((numbytes=recv(sock_fd,buf,MAXBTYEMUN,0))==-1)
    {
        perror("receive failed");
        exit(1);
    }

    buf[numbytes]=‘\0‘;//在字符串末尾加上\0,否则字符串无法输出
    printf("Received: %s\n",buf);
    close(sock_fd);*/
    return 0;
}
时间: 2024-10-10 17:54:05

点对点通信程序的相关文章

(转)集成架构:对比 Web API 与面向服务的架构和企业应用程序集成

摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API 管理与在它之前出现的集成架构(比如 SOA 和 EAI)有何不同. 简介 几乎所有企业都有多个应用程序作为其关键数据的记录系统,而且还拥有它们赖以创业的业务功能.因此,一些组织想要不断向其企业内外更广泛的受众揭示这些操作系统中的宝贵资产,我们对此已司空见惯.但是,这需要时间.在本教程中,我们将介绍

一个程序员创业一年后失败的感悟

内容简介:创业,就必须要找一个方向,基于移动互联的大众化产品,我相信我没有那个实力去做,因此只能找一个行业方向.不管怎样,开始着手做吧,不为别的,只为梦想!这次花光了我打工时的所有积蓄.经历过这的次创业,虽然失败,但不后悔. 2011年,坚决辞去了发展还不错的工作.我觉得,这不是我想要的生活,我我在心理呐喊,我要创业!我自负地认为:我可以实现更高的自我价值.怀着一种为了创业而创业的心态,就这样开始了自己的创业体验. 创业,就必须要找一个方向,基于移动互联的大众化产品,我相信我没有那个实力去做,因

《Java项目实践》:简单聊天程序

<Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也就需要为Client写一个界面.因此,这就是我们第一步需要完成的任务. 第一步:为Client端写一个界面 完成一个界面有两种方法,一种是使用Frame对象来完成,另外一种是继承JFrame类来完成.本项目使用第二种. 第二种继承JFrame类完成的界面的程序如下: public class ChatClie

(15)疯狂的程序员----《绝影》

<疯狂的程序员> <疯狂的程序员>1 天已经七分黑了,屋里却还没开灯.这个全身黑衣服的男子突然像想起什么,从包里掏出烟,抽出一只,递给旁边的人:"兄弟,抽烟么?"――那烟是红塔山. 旁边那人连忙一边摆手,一边说:"不,不."语气有点紧张,好像那黑衣服递过来的不是烟,是海洛因. 这个黑衣服的男子,后来的网名叫"绝影".他旁边那个,后来被他们称为"土匪".这件屋子,就是他们大学寝室. 第一天到学校,其实没有

集成架构:对比 Web API 与面向服务的架构和企业应用程序集成(转)

http://kb.cnblogs.com/page/521644/ 摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API 管理与在它之前出现的集成架构(比如 SOA 和 EAI)有何不同. 简介 几乎所有企业都有多个应用程序作为其关键数据的记录系统,而且还拥有它们赖以创业的业务功能.因此,一些组织想要不断向其企业内外更广泛的受众揭示这些操作系统中的

Java程序员学习之路

1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它任何一本书可以超越它.该书的作者Bruce Eckel在网络上被称为天才的投机者,作者的<Thinking in C++> 在1995年曾获SoftwareDevelopment Jolt Award最佳书籍大奖,<Thinking in Java>被评为1999年Java

『默哀』你的梦或许因为这个新闻而碎了【用你的程序语言 抛出一行异常】

对很多程序猿而言: 提升技术,构思产品,熬夜编码,拉到风投,艰苦创业,做大公司 —— 这是很多程序猿的梦想. 2017-09-09最新新闻 —— 你的梦或许碎了: <传WePhone创始人自杀,去世前称被前妻勒索1000万> 立两个Flag先: > 新闻最新发生,目前民意是 95%支持 创业者.但!目测两天之内,其妻翟某某 就会请 水军 赶赴战场 —— 祸乱三观. > 逼丈夫自杀,目测 翟某某 可能会成为遗产继承人(如果离婚手续还没办完) —— 完蛋!逼死人的人,拿完 离婚协议款,

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

微信小程序——豆瓣电影——(2):小程序运行部署

Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash $ git clone https://github.com/zce/weapp-demo.git weapp-douban --depth 1 $ cd weapp-douban 打开微信Web开放者工具(注意:必须是0.9.092300版本) 必须是0.9.092300版本,之前的版本不能保证正