服务器,客户端都是父进程、子进程分别负责发送、接收字符串。

  另外使用了信号函数来发送和接收处理信号,比如当子进程结束时,传递一个信号给父进程,然后父进程会执行信号处理函数。

服务器端:

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<sys/types.h>
 4 #include<sys/socket.h>
 5 #include<errno.h>
 6 #include<netinet/in.h>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<signal.h>
10
11 void handler(int sig)//这是信号处理函数
12 {
13     printf("recv a sig:%d",sig);
14     exit(EXIT_SUCCESS);
15 }
16
17 int main()
18 {
19     int sockfd=socket(AF_INET,SOCK_STREAM,0);
20     if(sockfd<0) perror("socket!!!!");
21
22     int on=1;
23     int result=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//启用套接字选项,必须在bind之前完成
24     if(result<0) perror("setsockopt");
25
26     struct sockaddr_in server_addr;
27     memset(&server_addr,0,sizeof(server_addr));
28     server_addr.sin_family=AF_INET;
29     server_addr.sin_port=htons(888);
30     server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
31
32
33     int res=bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
34     if(res<0)perror("bind!!!");
35
36     res=listen(sockfd,50);
37     if(res<0) perror("listen!!");
38
39     int conn_fd;
40     struct sockaddr_in peeraddr;
41     int addr_len=sizeof(peeraddr);
42     pid_t pid;
43
44         conn_fd=accept(sockfd,(struct sockaddr*)&peeraddr,&addr_len);
45                 if(conn_fd<0)perror("accept!!");
46         printf(" the ip of client:%s,the port of client:%d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));//打印对等方的ip与端口
47
48         //signal(SIGUSR1,handler);
49         pid=fork();
50         if(pid<0)
51             perror("fork failed");
52         else if(pid==0)
53         {            //子进程
54             char recvbuf[1024]={0};
55             while(1)
56             {
57                 memset(recvbuf,0,sizeof(recvbuf));
58                 int resu;
59                 resu=read(conn_fd,recvbuf,sizeof(recvbuf));
60                 if(resu<0)perror("read");
61                 else if(resu==0)
62                 {
63                     printf("peer closed!!!!");
64                     //exit(EXIT_SUCCESS);
65                     kill(getppid(),SIGUSR1);//发送一个信号给父进程
66                     break;
67                 }
68                 fputs(recvbuf,stdout);
69             }
70             //close(conn_fd);
71             //close(sockfd);
72             exit(EXIT_SUCCESS);
73         }
74         else //父进程
75         {
76             signal(SIGUSR1,handler);//安装信号接收函数
77             char sendbuf[1024]={0};
78             while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)
79             {
80                 write(conn_fd,sendbuf,strlen(sendbuf));
81                 memset(sendbuf,0,sizeof(sendbuf));
82         }
83         //close(conn_fd);
84         //close(sockfd);
85         exit(EXIT_SUCCESS);
86         }
87         return 0;
88 }

客户端:

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<sys/types.h>
 4 #include<sys/socket.h>
 5 #include<errno.h>
 6 #include<netinet/in.h>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 int main()
10 {
11     int sockfd= socket(AF_INET,SOCK_STREAM,0);
12     if(sockfd<0)perror("socket");
13
14     struct sockaddr_in server_addr;
15     memset(&server_addr,0,sizeof(server_addr));
16     server_addr.sin_family=AF_INET;
17     server_addr.sin_port=htons(888);    //this port number is owned by server,and client's port number is appointed by random
18     server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器端的ip地址
19
20     int res=connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
21     if(res<0)perror("connect!!!!!!!");
22
23     pid_t pid;
24     pid=fork();
25     if(pid<0)perror("fork");
26     if(0==pid)//子进程
27     {
28         char recvbuf[1024];
29         int ret;
30         while(1)
31         {
32             memset(recvbuf,0,sizeof(recvbuf));//防止空间中的内容干涉,拖泥带水
33             ret=read(sockfd,recvbuf,sizeof(recvbuf));
34             if(ret<0)perror("read");
35             if(ret==0)
36             {
37                 printf("peer closed!!!!!!!");
38                 break;
39             }
40             fputs(recvbuf,stdout);
41         }
42         close(sockfd);
43     }
44     else
45     {
46         char sendbuf[1024];
47         while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){
48         write(sockfd,sendbuf,strlen(sendbuf));
49         memset(sendbuf,0,sizeof(sendbuf));
50     }
51     //exit(EXIT_SUCCESS);}
52     close(sockfd);
53     }
54     return 0;
55 }

View Code

转载于:https://www.cnblogs.com/chess/p/4684771.html

点对点 客户端-服务器 聊天程序相关推荐

  1. C#下如何实现服务器+客户端的聊天程序

    C#下如何实现服务器+客户端的聊天程序 最近也在接触SOCKET编程,在当今这样一个网络时代,很多技术都以网络为中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在实现网络通讯上处于关键地位, ...

  2. 简单客户端服务器网络通信程序

    目录 今日良言:但行前路,不负韶华 一.Socket套接字 二.简单客户端服务器的网络通信程序 今日良言:但行前路,不负韶华 一.Socket套接字 网络编程的核心就是Socket(套接字) API, ...

  3. 【Java】Socket多客户端Client-Server聊天程序

    文章目录 任务要求 实现代码 工具类 服务器端线程 客户端线程 服务器端程序 客户端程序 运行说明 任务要求 编写一个简单的Socket多客户端聊天程序: 客户端程序,从控制台输入字符串,发送到服务器 ...

  4. C#下如何实现服务器 + 客户端的聊天程序

    最近也在接触SOCKET编程,在当今这样一个网络时代,很多技术都以网络为中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在实现网络通讯上处于关键地位,所以不会SOCKET是不行的. 首先,本 ...

  5. java打开客户端程序_Java客户端服务器应用程序 - 已在使用的地址:connect

    我目前正在开发一个简单的多人游戏,其中有几个客户需要连接到服务器 . 我的服务器由一个serverSocket组成 . 此serverSocket接受传入连接并将其交给启动单独线程的连接对象 . Se ...

  6. java客户端服务器聊天程序流程图_基于java的socket简单聊天编程

    socket编程: 一:什么是socket:socket是BSD UNIX的通信机制,通常称为"套接字",其英文原意是"孔"或"插座".有些 ...

  7. qt客户端显示服务器发送的图片,c++ - Qt客户端服务器应用程序“发送图像”出现问题 - 堆栈内存溢出...

    我正在尝试通过QDataStream从客户端向服务器发送图像( OpenCV Mat ). 第一项是int,即缓冲区的大小. 它可以处理10到15张图片,然后服务器读取第一个int随机数(通常〜2 ^ ...

  8. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK...

    LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...

  9. 使用TDI与WinSock进行客户端服务器编程

    简介: 在本文中,您将了解到使用传输驱动程序接口TDI与应用层套接字WinSock客户端服务器应用程序内核级编程实现细节.介绍常用的TDI函数并提供编写TDI与WinSock(TCP)应用程序的详细说 ...

最新文章

  1. 阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer
  2. 【 MATLAB 】find 函数的使用(线性索引)
  3. 26日上午网易等多家网站无法访问“剖析”
  4. JavaScript中使用字符串调用函数
  5. 主机和虚拟机ping不通的原因
  6. 深度学习都是非凸问题_神经网络的损失函数为什么是非凸的?
  7. 累加器A用c语言,累加器A的主要作用是什么_一文解析累加器a和acc的区别
  8. 精英赛上线|冠军万元奖金
  9. 2017-09-26 10:45:51.905 ERROR 9704 --- [nio-8080-exec-5] com.linktrust.aspect.AopLogger :
  10. linux系统用虚拟光驱装win7,用虚拟光驱加载win7或者xp iso镜像文件安装系统的图解步骤...
  11. Xshell颜色及PS1
  12. 合适新手入门的串口屏学习分享
  13. 摄影师的“伟大”!分享一组高大上的“照骗”的前期与后期
  14. hackerrank初级篇之Mini-Max Sum
  15. 04 第三章 命题逻辑的推理理论
  16. 入门微信小程序开发(三)数据绑定的几种用法
  17. 图片的不同分类以及特性
  18. 服务器被封 如何上微信,微信永久封号有救吗 解除微信永久封号的方法
  19. Cantor三分集为啥不能在Myeclipse上完美实现呢?
  20. GEO数据库中搜索数据

热门文章

  1. Swift - 重写导航栏返回按钮
  2. Linux环境变量PSI指什么,PSI 文件扩展名: 它是什么以及如何打开它?
  3. stract oracle,ORACLE 字符串聚合函数 strCat
  4. 信息系统管理19年真题选择题
  5. 操作系统:提升电脑开机速度的15个小技巧
  6. 【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
  7. 100+ 值得收藏的 Web 开发资源
  8. 如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
  9. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
  10. php遍历视频文件,php使用glob函数遍历文件和目录详解