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等服务让自己用,但是自己的电脑一般没 ...
随机推荐
- python yield
http://www.jb51.net/article/15717.htm 这里还不错 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist) ...
- Effective Java 72 Don't depend on the thread scheduler
Principle Any program that relies on the thread scheduler for correctness or performance is likely t ...
- 【mysql】关于Index Condition Pushdown特性
ICP简介 Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from ...
- 深入PHP内核之in_array
无意中看到一段代码 1.a.php <?php $y="12"; $x = array(); for($j=0;$j<50000;$j++){ $x[]= " ...
- MTOM以及在WCF中的应用
关于MTOM的基本概念 提到MTOM消息优化传输机制,通常的实验结果是使用MTOM传输数据会提高大约33%的性能. 消息传输优化机制 (MTOM) 标准允许将消息中包含的大型数据元素外部化,并将其作为 ...
- 问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件
大家不要笑我了,我不喜欢用那个人家写的串口类. 所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类. -------------声明--------------- 本文 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(6)使用浮点指令进行64位除法
罗云彬 典藏版Page192,mark下. 这段代码看不懂,手册上根本没有fdivr不带操作数的指令. .data dqTickCounter1 dq ? dqTickCounter2 dq ? dq ...
- 动态规划--模板--hdu 1059 Dividing
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- [部署]CentOS安装apache
环境 虚拟机:VMWare10.0.1 build-1379776 操作系统:CentOS7 64位 步骤 1.使用yum安装 yum install httpd httpd-devel 2.启动 a ...
- 原始的2文件的makefile错误
从来没系统的看过makefile文档,平时属于复制模板,用完即忘,下午尝试按自己的理解写一个最简单的makefile,含2个.c文件,1个.h文件,费了个把小时,参考别人的文章才弄出来,特记录. ma ...