Linux c实现服务端与客户端聊天
主要利用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实现服务端与客户端聊天的更多相关文章
- linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)
前言 在搭建个人博客时,由于没有使用任何框架,纯手工code前台和后台,导致遇到许多问题,其中一个问题就是mysql连接导致的页面相应速度异常低.在查询各种途径后,只能考虑使用memcache缓存.在 ...
- Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)
一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- asp.net获取服务端和客户端信息
asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...
- 一些java考过的测试题和自己制作模拟服务端和客户端
媒体 1,java环境变量: PATH: .;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; CLASSPATH: .;%JAVA_HOME%\jre\lib\rt.jar ...
- 使用flask_socketio实现服务端向客户端定时推送
websocket连接是客户端与服务器之间永久的双向通信通道,直到某方断开连接. 双向通道意味着在连接时,服务端随时可以发送消息给客户端,反之亦然,这在一些需要即时通讯的场景比如多人聊天室非常重要. ...
- Python3学习之路~8.3 socket 服务端与客户端
通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...
- centos7下使用n grok编译服务端和客户端穿透内网
(发现博客园会屏蔽一些标题中的关键词,比如ngrok.内网穿透,原因不知,所以改了标题才能正常访问,) 有时候想在自己电脑.路由器或者树莓派上搭建一些web.vpn等服务让自己用,但是自己的电脑一般没 ...
随机推荐
- 常用vi编辑命令
在自己的博客里存起来,这么多全记住确实有点难,时不时的翻一翻到是可以的. 摘自:http://www.cnblogs.com/junw_china/articles/1708967.html 光标控制 ...
- Swing应用开发实战系列之二:设计日期选择面板窗口
Swing本身没有提供什么华丽丽的日期时间选择控件,所以笔者就在网上搜了个第三方的jar包jdatepicker-1.3.2.jar,基于此设计了个很轻量的日期选择面板,很简单的.效果图如下所示: 代 ...
- nyoj 115 城市平乱 dijkstra最短路
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=115 dijkstra算法. #include "stdio.h" ...
- Loj 1003–Drunk(拓扑排序)
1003 - Drunk PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB One of my fr ...
- 23 其它话题 - 《Python 核心编程》
- Mongodb--gridfs与分片实验
1.放置一个大文件到gridfs,查看fs.chunks和fs.files的情况. Step1.开启一台mongod服务. ./mongod --dbpath dbs/master 登录mon ...
- sqlite查询结果在listview中展示
1.获取db实例 SQLiteDatabase db=dbhelper.getWritableDatabase(); 2.Cursord对象获取查询结构 Cursor cursor=db.rawQue ...
- Ubuntu 14.04 LTS Server 无法挂载光盘 启动initramfs等问题
今天需要在戴尔R410服务器上装64位的Linux,师兄给了个14.04的server 64位镜像.一开始打算用U盘安装,用软碟通烧写镜像之后,在服务器端设置从U盘启动,但是安装到一半出现了光盘无法挂 ...
- 该怎么快速完成ZBrush中脸部的雕刻
骨骼,是一门基础艺术,几百年来一直为伟大的艺术大师所研究,它曾经,也将一直是创作现实且可信角色的关键,提高骨骼知识更将大大提高雕刻技能. 若有疑问可直接访问:http://www.zbrushcn.c ...
- 五个有用的jquery小技巧
1.禁用鼠标右键 $(document).ready(function() { $(document).bind("contextmenu", function(e) { retu ...