点对点 客户端-服务器 聊天程序

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

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

服务器端:

 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 }

时间: 2024-07-30 01:26:26

点对点 客户端-服务器 聊天程序的相关文章

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating-a-wpf-chat-client-server-application/ 注意:本教程是相当广泛的,如果你是在短请也看到我们的东西 开始和 如何在几分钟内创建一个客户端服务器应用程序教程. 注2:本例中包括,明显延长进一步证明功能,在包中包含的示例 包下载. 在我们开始之前确保您已经安装了Vis

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

LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SDK,通过一些不同的配置来创建一些客户端/服务器应用程序.例如,如果有一个服务器需要向多个客户端发送音频/视频数据,那么就可以在服务器上创建这样的应用程序,比如多点传送或Web广播中的web多点传播.此外,当有多个捕捉点向一个源发送视频数据时,您可以创建安全/监控应用程序. 产品特征: 视频会议二进制

服务器客户端回射程序-自己设计包的结构

这次是个点对点,不过我自己设计包,包中包括发送的字符串的长度,和实际的字符串,使用结构体来表示. 客户端跟服务器在接收报文时,首先接收字符串的长度这一数值,然后将这一数值作为参数传入readn接收固定长度的字节数字符串. 看代码,首先是服务器端: 1 /*使用发送固定字节数报文的点对点聊天程序*/ 2 #include<stdio.h> 3 #include<unistd.h> 4 #include<sys/types.h> 5 #include<sys/sock

socket实现的一个基本点对点聊天程序

多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口. 服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态. 客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字.为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求.

Linux 下基于多线程服务器/客服端聊天程序源码

Linux 下基于多线程服务器/客服端聊天程序,采用阻塞的socket技术,和多线程技术实现. 客服端程序:client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

聊天程序 android和swing客户端

聊天程序,swing做服务器,客户端为android和swing,可以进行相互之间的通讯,实现的功能如下图: 基本思路: 启动服务器: 启动服务器线程,等待客户端的连接,启动广播线程,负责向客户端发送消息 启动客户端线程,维持服务器与单个客户端的连接,负责接收从客户端发送过来的消息 android和swing客户端: 登陆进入聊天室:获得与服务器连接的输入和输出流,进行相互之间的额通讯 客户端也是一个线程对象,用于监听从服务器发送过来的信息,并更新界面 主要实现的技术:Socket网络编程.Th

boost asio异步读写网络聊天程序客户端 实例详解

// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://ww

Socket聊天程序——客户端

写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细设计和Common模块记录一下,因为这个周末开始就要去忙其他东西了. 设计: 客户端设计主要分成两个部分,分别是socket通讯模块设计和UI相关设计. 客户端socket通讯设计: 这里的设计其实跟服务端的设计差不多,不同的是服务端是接收心跳包,而客户端是发送心跳包,由于客户端只与一个服务端进行通