主要利用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. LightSpeed 之Sql和存储过程的使用

    虽然使用LightSpeed提供的Query就可以解决绝大部分问题,但如果业务逻辑过于复杂,有时候还是需要执行SQL语句或者存储过程 用SQL的方式就是使用FindBySql. FindBySql的参 ...

  2. 6天的巴厘岛旅行 I love Bali

    6天的巴厘岛旅游今天结束了,从第一天的踏进异国之域的新奇,到最后一天的将且回程的恋恋不舍,要记下的.不愿忘记的东西太多太多. 1.下午5点半抵达巴厘岛登巴萨国际机场,7点半才出机场,让Ricky导游和 ...

  3. 烂泥:KVM快照的创建与恢复

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 因为要做有关KVM虚拟机的实验,所以需要虚拟机生成快照.查询相关资料,说KVM可以使用两种方法生成虚拟机的快照. 方法一.使用qemu-img snap ...

  4. volatile 关键字

    就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致这样的结果:要么无 ...

  5. Android 开发框架

    Android 开发框架包括基本的应用功能开发.数据存储.网络访问三大块. 1 应用方面 一般而言,一个标准的Android 程序包括Activity.Broadcast Intent Receive ...

  6. Jenkins插件hyper slaves源码分析

    1.public class HyperSlaves extends Plugin implements Describable<HyperSlaves> (1).init():初始化co ...

  7. MIT jos 6.828 Fall 2014 训练记录(lab 4)

    源代码参见我的github: https://github.com/YaoZengzeng/jos Part A: Multiprocessor Support and Cooperative Mul ...

  8. UESTC 32 树上战争(Battle on the tree)

    这题其实很简单,每个人肯定都往上走,才能保证尽快赢,所以无非是看谁离根节点近,即深度小..用并查集中的findset思想,不断找父节点一直到根节点来找深度就可以了. 代码: #include < ...

  9. Unity中小地图做法

    FPS游戏的小地图 在FPS的这个Demo中,制作了一个小地图,效果图如下 主相机设置 下面来看一下,主相机的设置 解释 通过上面两幅图,能够看出来两个摄像机所渲染的Layer不一样,当然它们所在的L ...

  10. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...