主要利用socket通信实现,具体代码如下

客户端:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 511 char *EXIT_STRING = "exit";
int input_and_send(int sd);
int recv_and_print(int sd); int main(int argc, char *argv[]){
pid_t pid;
int s;
static struct sockaddr_in servaddr; if(argc != ){
printf("사용법: %s server_ip port \n",argv[]);
exit();
}
if((s = socket(PF_INET, SOCK_STREAM, )) < ){
printf("Client: Can't open stream socket.\n");
exit();
} bzero((char *)&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, argv[], &servaddr.sin_addr);
servaddr.sin_port = htons(atoi(argv[])); if(connect(s,(struct sockaddr *)&servaddr,sizeof(servaddr)) < ){
printf("Client: can't connect to server.\n");
exit();
}
if( (pid=fork())> )
input_and_sent1(s);
else if(pid == )
recv_and_print(s);
close(s);
return ;
} int input_and_sent1(int sd){ char buf[MAXLINE+];
int nbyte;
while(fgets(buf, sizeof(buf),stdin) != NULL){
nbyte = strlen(buf);
write(sd, buf, strlen(buf));
if(strstr(buf,EXIT_STRING) != NULL){
puts("Good Bye!");
close(sd);
exit();
}
}
return ;
} int recv_and_print(int sd){
char buf[MAXLINE+];
int nbyte;
while(){
if((nbyte=read(sd, buf,MAXLINE))<){
perror("read fail");
close(sd);
exit();
}
buf[nbyte] = ;
if(strstr(buf,EXIT_STRING) != NULL)
break;
printf("Girl: %s",buf);
}
return ;
}

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> char *EXIT_STRING = "exit";
int recv_and_print(int sd);
int input_and_send(int sd);
#define MAXLINE 511 int main(int argc, char *argv[])
{
struct sockaddr_in cliaddr, servaddr;
int listen_sock,accp_sock,addrlen = sizeof(cliaddr);
pid_t pid;
if(argc != ){
printf("사용법: %s port\n",argv[]);
exit();
} if((listen_sock=socket(PF_INET, SOCK_STREAM, )) < ){
perror("socket fail");
exit();
} bzero((char *)&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(argv[])); if(bind(listen_sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < ){
perror("bind fail");
exit();
}
puts("等待连接......");
listen(listen_sock, ); if((accp_sock = accept(listen_sock,(struct sockaddr *)&cliaddr, &addrlen)) < ){
perror("accept fail");
exit();
} puts("连接成功.....");
if((pid = fork()) > )
input_and_send(accp_sock);
else if(pid == )
recv_and_print(accp_sock);
close(listen_sock);
close(accp_sock);
return ;
} int input_and_send(int sd){
char buf[MAXLINE+];
int nbyte;
while(fgets(buf, sizeof(buf),stdin) != NULL){
nbyte = strlen(buf);
write(sd, buf ,strlen(buf));
if(strstr(buf, EXIT_STRING) != NULL){
puts("Good Bye.");
close(sd);
exit();
}
}
return ;
} int recv_and_print(int sd){
char buf[MAXLINE+];
int nbyte;
while(){
if((nbyte=read(sd, buf, MAXLINE)) < ){
perror("read fail");
close(sd);
exit();
}
buf[nbyte] = ;
if(strstr(buf, EXIT_STRING) != NULL)
break;
printf("Harley Gwak: %s",buf);
}
return ;
}

第一次写博客,一直都是伸手党,今天就把我之前写过的东西分享下,代码正常运行的,仅供参考。

Linux c实现服务端与客户端聊天的更多相关文章

  1. linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)

    前言 在搭建个人博客时,由于没有使用任何框架,纯手工code前台和后台,导致遇到许多问题,其中一个问题就是mysql连接导致的页面相应速度异常低.在查询各种途径后,只能考虑使用memcache缓存.在 ...

  2. Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)

    一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...

  3. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  4. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  5. 一些java考过的测试题和自己制作模拟服务端和客户端

    媒体 1,java环境变量: PATH: .;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;  CLASSPATH: .;%JAVA_HOME%\jre\lib\rt.jar ...

  6. 使用flask_socketio实现服务端向客户端定时推送

    websocket连接是客户端与服务器之间永久的双向通信通道,直到某方断开连接. 双向通道意味着在连接时,服务端随时可以发送消息给客户端,反之亦然,这在一些需要即时通讯的场景比如多人聊天室非常重要. ...

  7. Python3学习之路~8.3 socket 服务端与客户端

    通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...

  8. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  9. centos7下使用n grok编译服务端和客户端穿透内网

    (发现博客园会屏蔽一些标题中的关键词,比如ngrok.内网穿透,原因不知,所以改了标题才能正常访问,) 有时候想在自己电脑.路由器或者树莓派上搭建一些web.vpn等服务让自己用,但是自己的电脑一般没 ...

随机推荐

  1. html 关于内部是float元素的外部div高度为0的解决方法!

    最近编写一个页面的时候遇见一个问题,外部div是block的,而内部元素是float的,大家应该都知道float的元素是没有实际高度的,就算你设置了float元素的高度他也不会撑开外部block元素的 ...

  2. spring源码分析的书到了

    现在写java后台可以说都能用上spring 在原有的spring基础上,加上自己定制的一些功能,能够使编程变得非常简化. 我也准备在我的毕业设计中写一些spring改造的东西.用来简化开发. 就拿连 ...

  3. PHP模拟发送POST请求之一、HTTP协议头部解析

    WEB开发中信息基本全是在POST与GET请求与响应中进行,GET因其基于URL的直观,易被我们了解,可POST请求因其信息的隐蔽,在安全的同时,也给开发者们模拟发送带来了麻烦.接下来的几篇博文中,我 ...

  4. yum命令不能使用的相关错误

    使用yum安装软件时,出现下面报错 [root@localhost ~]# yum install -y lrzszLoaded plugins: fastestmirror, securityLoa ...

  5. Windows环境下maven 安装与环境变量配置

    Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...

  6. [分享]一个String工具类,也许你的项目中会用得到

    每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...

  7. Altium Designer PCB制作入门实例

    概要:本章旨在说明如何生成电路原理图.把设计信息更新到PCB文件中以及在PCB中布线和生成器件输出文件.并且介绍了工程和集成库的概念以及提供了3D PCB开发环境的简要说明.欢迎使用Altium De ...

  8. C++ new(2)

    1. new与operator new C++中有很多语法让人难以理解,如:new operator(操作符,下同)和operator new之间差异,确切的说,应该是new与operator new ...

  9. javascript判断回文数

    "回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...

  10. android应用中去掉标题栏的方法

    现在我坚定的认为写技术博客对自己有很大的帮助,写博客给自己一个学而思的机会. 在Android中去掉标题栏有三种方法,它们也有各自的特点. 1.在代码里实现 this.requestWindowFea ...