ubuntu环境下实现 多线程的socket(tcp) 通信
改改就是个小型局域网聊天
服务器端:
// File Name: process_server.c
// Author: jiujue
// Created Time: 2019年03月10日 星期日 20时29分18秒 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <unistd.h>
#include <sys/socket.h>
#include <ctype.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <pthread.h> typedef struct sock_info
{
int m_fd;
pthread_t m_pthid;
struct sockaddr_in m_addr; }Sock_info; void* works(void* arg)
{
Sock_info *c_info = (Sock_info*)arg; //obtain client info
int client_port = ntohs(c_info->m_addr.sin_port);
char client_Ip[]; socklen_t buf_len = sizeof(client_Ip); inet_ntop(AF_INET, (void*)&c_info->m_addr.sin_addr.s_addr,client_Ip,buf_len); printf("\t\t\t\t Ip %s, port %d,connect successful\n",client_Ip,client_port); while()
{
char buf[] = {};
int read_len = read(c_info->m_fd, buf, sizeof(buf));
if(read_len > )
{
buf[read_len+]='\n';
printf("->-> Obtain if of ,Ip %s, port %d, send info: %s\n",client_Ip,client_port,buf);
write(c_info->m_fd,buf,strlen(buf));
}
else if( == read_len)
{
printf("\t\t\t\t Ip %s, port %d, disconnect\n",client_Ip,client_port);
break;
}
else if(- == read_len)
{
perror("read error");
exit();
}
} return NULL;
} int main(int argc, const char* argv[])
{
if(argc < )
{
printf("eg: ./app IP Port\n");
exit();
}
short port = atoi(argv[]); int lfd = socket(AF_INET, SOCK_STREAM, );
if(- == lfd)
{
perror("socket error");
exit();
} struct sockaddr_in serv;
serv.sin_port = htons(port);
serv.sin_family = AF_INET;
inet_pton(AF_INET, argv[], &serv.sin_addr.s_addr); int res = bind(lfd, (struct sockaddr *)&serv, sizeof(serv));
if(- == res)
{
perror("bind error");
exit();
} res = listen(lfd, );
if(- == res)
{
perror("listen error");
exit();
} while()
{
printf("\a Wait accepting...\n");
struct sockaddr_in client_add; socklen_t len = sizeof(client_add); int cfd = accept(lfd,(struct sockaddr*)&client_add, &len); while(- == cfd && cfd == EINTR)
{
cfd = accept(lfd,(struct sockaddr*)&client_add, &len);
} // supply son pthread info
Sock_info* s_info =(Sock_info*)malloc(sizeof(Sock_info)); s_info->m_fd = cfd;
s_info->m_addr = client_add; int res = pthread_create(&s_info->m_pthid, NULL, works, (void*)s_info);
if(res == -)
{
perror("pthread_creat error");
exit();
}
pthread_detach(s_info->m_pthid); } close(lfd);
return ;
}
客户端:
// File Name: socket_client.c
// Author: jiujue
// Created Time: 2019年03月09日 星期六 13时00分05秒 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int argc, const char* argv[])
{ if(argc < )
{
printf("eg: ./app Ip Port\n");
exit();
}
int port = atoi(argv[]); int fd = socket(AF_INET, SOCK_STREAM, );
if(- == fd)
{
perror("socket error");
exit();
} struct sockaddr_in serv; serv.sin_port = htons(port);
serv.sin_family = AF_INET;
inet_pton(AF_INET, argv[], &serv.sin_addr.s_addr); socklen_t len = sizeof(serv);
int res = connect(fd,(struct sockaddr *) &serv, len);
if(- == res)
{
perror("connect error");
exit();
}
printf("Connectt server successful!!\n"); while()
{
printf("Please input string\n>>");
char buf[];
fgets(buf,sizeof(buf),stdin);
write(fd, buf, strlen(buf));
printf("send buf: %s\n",buf);
len = read(fd,buf,(buf));
if(len > )
{
printf("Recv buf: %s\n",buf);
}else if(len == )
{
printf("Serer disconnect \n");
break;
}
else if(- == len)
{
perror("Read errror");
exit();
}else
{
printf("I no now\n");
}
} close(fd);
return ;
}
结语:有问题欢迎提在下方 ,本人在校学生,时间较为充裕, 有时间会回复的。
/* 原创文章 转载请附上原链接: https://www.cnblogs.com/jiujue/p/10513859.html */
ubuntu环境下实现 多线程的socket(tcp) 通信的更多相关文章
- ubuntu环境下docker安装步骤
本文是根据docker官方文档翻译,原文:https://docs.docker.com/engine/installation/linux/ubuntulinux/ Docker 支持以下 Ubun ...
- Linux(Ubuntu)环境下使用Fiddler
自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...
- 多线程编程之Linux环境下的多线程(三)
前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linu ...
- 多线程编程之Linux环境下的多线程(一)
一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...
- Go学习笔记(一):Ubuntu 环境下Go的安装
本文是根据<Go Web 编程>,逐步学习 Ubuntu 环境下go的安装的笔记. <Go Web 编程>的URL地址如下: https://github.com/astaxi ...
- Ubuntu环境下SSH的安装及使用
Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机 ...
- Ubuntu环境下的Redis 配置与C++使用入门
Redis是一个高性能的key-value数据库. Redisedis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用.它 ...
- ubuntu 环境下的QT程序打包
很多的时候 需要将自己写的QT 程序发布一下 所以今天教一下 怎么在ubuntu 环境下将自己的写的Qt 程序打包打包是为了不依赖 开发环境 和开发的库. 1. QtCreate使用Release版 ...
- ubuntu环境下eclipse的安装以及hadoop插件的配置
ubuntu环境下eclipse的安装以及hadoop插件的配置 一.eclipse的安装 在ubuntu桌面模式下,点击任务栏中的ubuntu软件中心,在搜索栏搜索eclipse 注意:安装过程需要 ...
随机推荐
- 【3】Asp.Net Core2.2新版管道处理模型
[前言] 上一篇完成了Asp.Net Core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的MVC没啥差别!但这些都是在组件封装的基础上完成的,在Core里面,其 ...
- rsync命令详解、rsync用ssh隧道方式同步
● rsync格式安装命令 yum install -y rsync与scp的区别:scp复制为完全覆盖,rsync为增量同步,只同步修改过的数据.rsync命令格式如下: rsync 选项 源文件 ...
- Java的内存泄露
Java的内存泄露 1.静态集合类引起内存泄漏 像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们 ...
- 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?
微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- 驰骋工作流引擎 -CCBPM如何自动升级
关键词:工作流引擎自动升级 工作流自动升级升级步骤设置1,CCBPM把更新分成三类, 应用程序代码更新.数据表结构更新.数据更新.2,CCBPM在您登录流程设计器时自动判断当前的版本与数据库版本是 ...
- openlayers4 入门开发系列之热力图篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- 章节八、3-如何用Chrome开发者工具查看元素
一.如何使用开发者工具,操作步骤与火狐浏览器一致(此处不重复叙述,此处主要描述如何查找元素是否存在以及元素在页面中是否重复). 1.打开开发者选项,然后按“ctrl+f”,会出现一个输入框在输入框中输 ...
- Java基础——集合(持续更新中)
集合框架 Java.util.Collection Collection接口中的共性功能 1,添加 booblean add(Object obj); 往该集合中添加元素,一次添加一个 boolea ...
- 每日分享!~ vue JavaScript中为什么可以读取到字符串的长度!(包装对象)
首先需要知道什么是包装对象? 对象是JavaScript语言下最主要的数据类型,三种原始的值-----数值,字符串,布尔值,在一定条件下会自动的转为对象.也就是原始类型的包装对象: 也就是通过如下方式 ...
- [Vue] karme/jasmine/webpack/vue搭建测试环境
karma 和 jasmine karma 是 google 开源的一个基于 Node.js 的 JavaScript 前端测试运行框架,前身叫 Testacular. jasmine 是一个 jav ...