Linux 下 简单客户端服务器通讯模型(TCP)
服务器端:server.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h> #define ServerPort 6080
#define MaxUser 8 typedef struct _server{ int sock_fd; int new_fd; struct sockaddr_in my_addr; } Server; typedef struct _client{ int sock_fd; struct sockaddr_in my_addr; } Client; static Server *server; static Client *client; void socket_server_init(Server * server){ server -> my_addr.sin_family = AF_INET; server -> my_addr.sin_port = htons(ServerPort); server -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server -> my_addr.sin_zero),); } int socket_server_create_bind_listen(Server * server){ int sin_size,ret, on; if((server -> sock_fd = socket(AF_INET,SOCK_STREAM,)) == -){ perror("faild to create socket :\n"); return -;
}
on = ; ret = setsockopt( server -> sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); if(ret=bind(server -> sock_fd,
(struct sockaddr *)&server -> my_addr,
sizeof(struct sockaddr))==-){ perror("failed to bind \n"); return -; }
if(listen(server -> sock_fd,MaxUser)==-){ perror("failed to listen \n"); return -;
} return ;
} void server_send_msg(int fd){ char buff[]; while(){ fgets(buff,,stdin); if(send(fd,buff,,)==-){ perror("error to send :"); break;
} } } void server_wait_service(Server *server,Client *client){ int new_fd ,ret,sin_size; char buf[]; pthread_t tid; sin_size = sizeof(client ->my_addr); new_fd = accept(server ->sock_fd,(struct sockaddr *)&client->my_addr,&sin_size); if(new_fd <= ){ perror("accept error :"); }else{ ret = pthread_create(&tid,NULL,server_send_msg,new_fd); if(ret!=){ perror("error to create pthread"); }
while(){
if(recv(new_fd,buf,sizeof(buf),)>){ printf("\nclient said:\t\t%s\n",buf); }
}
}
} int main(int arg, char * argv[]){ server = (Server *)malloc(sizeof(Server)); client = (Client *)malloc(sizeof(Client)); socket_server_init(server); if(socket_server_create_bind_listen(server)){ server_wait_service(server,client); } return ; }
客户端代码:client.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <stdio.h>
#include <netdb.h> #define ServerPort 6080 typedef struct _server{ int sock_fd; int new_fd; struct sockaddr_in my_addr; } Server; typedef struct _client{ int sock_fd; struct sockaddr_in my_addr; } Client; Server *server; Client *client; void socket_server_init(Server * server){ server -> my_addr.sin_family = AF_INET; server -> my_addr.sin_port = htons(ServerPort); server -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server -> my_addr.sin_zero),); } void socket_client_init(Client * client){ client -> my_addr.sin_family = AF_INET; client -> my_addr.sin_port = htons(ServerPort+); client -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(client -> my_addr.sin_zero),); } int socket_client_create_connect(Server * server,Client * client){ if((client -> sock_fd = socket(AF_INET,SOCK_STREAM,)) == -){ perror("failed to create client socket \n"); return -; } else if(connect(client ->sock_fd,
(struct sockaddr *)&server ->my_addr,
sizeof(server ->my_addr))==-){ printf("failed to connect the server \n"); return -; }else return ; } void client_recv_msg(Client *client){ char buf[]; while(){ if(recv(client->sock_fd,buf,sizeof(buf),)>){ printf("\nserver said :\t\t%s\n",buf); }else break;
} } int main(int argc,char* argv[]){ server = (Server *)malloc(sizeof(Server)); client = (Client *)malloc(sizeof(Client)); char data[]; socket_server_init(server); socket_client_init(client); pthread_t tid; if(socket_client_create_connect(server,client)){ pthread_create(&tid, NULL,client_recv_msg, client); while(){ fgets(data,,stdin); if(send(client->sock_fd,data,,)==-){ perror("error to send :"); break;
}
}
} return ;
}
Makefile:
all: server client server: server.c gcc -o server server.c -pthread client: client.c gcc -o client client.c -pthread clean:
rm -f server client
执行效果:
server:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./server
client said: hello
hehe
client said: g
client said: goodbay
client:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello
server said : hehe
s^Hg
goodbay
去年的代码,做个备份。
Linux 下 简单客户端服务器通讯模型(TCP)的更多相关文章
- 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景
相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...
- Linux下查看Web服务器当前的并发连接数和TCP连接状态
对于web服务器(Nginx.Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态. $ netstat -n | ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)
目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...
- Linux下的SVN服务器搭建
Linux下的SVN服务器搭建 鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总 ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- Linux下的SVN服务器搭建(转)
Linux下的SVN服务器搭建 鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此 ...
- Linux下简单粗暴使用rsync实现文件同步备份【转】
这篇来说说如何安全的备份,还有一点不同的是上一篇是备份服务器拉取数据,这里要讲的是主服务器如何推送数据实现备份. 一.备份服务器配置rsync文件 vim /etc/rsyncd.conf #工作中指 ...
- Linux下安装Tomcat服务器和部署Web应用
一.上传Tomcat服务器
随机推荐
- (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
(1)首先创建java project 选择eclipse菜单上File->New->Java Project. 并命名为UploadFile. (2)加入必要的hadoop jar包 右 ...
- C语言easy忽视的细节(第四部分)
前言:本文的目的是记录C这些语言easy忽视的细节.我会每天花一点时间来阅读整理,坚持下去,今天是第一章.也许今天是下个月的第二,明年,今天是第几?--我坚信,,记性不如烂笔头.第四篇了.fight~ ...
- java科学和艺术语言 第六章 课后编程
家转载,为保留作者成果.转载请注明出处,http://blog.csdn.net/netluoriver,有些文件在资源中也能够下载!假设你没有积分,能够联系我索要. 1. package Sixth ...
- ExtJs4得知(五岁以下儿童)主要的Ext分类
Ext类是ExtJs最常见的.最基本的类,它是一个全局对象,它封装了全班.辛格尔顿和 Sencha 该方法提供了一种有用的库. 嵌套在该命名空间中一个较低的水平最用户界面组件. 但是提供了很多有用的功 ...
- ASP.NET程序读取二代身份证(附源码)
原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...
- HDU——B-number(数字DP)
标题效果: 要了解1至n如何号码之间有许多含有13,并13可分 记忆化搜索: dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态 有2个状态:含13 ...
- atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则
atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl规则的表单验证 1. 需求,表单验证须要弹框式,但眼下easyui ms绑定死了tooltip式样 1 2. 表单 ...
- SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系
刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...
- YARN简短的建筑
从Hadoop的0.23版本号,MapReduce进行了全面的彻底的变革.也就是我们今天看到的MapReduce 2.0或者我们也能够叫它YARN. 老版本号的JobTracker有两个基本的功能:资 ...
- Objective-C基调(4)Category
OC它提供了一种不同的方式--Category,可以动态地添加新的行为已经存在的类(方法),这确保了较小的类的原始设计,然后逐渐加入扩展. 正在使用Category扩张的上课时间,你并不需要创建一个子 ...