改改就是个小型局域网聊天

服务器端:

 // 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) 通信的更多相关文章

  1. ubuntu环境下docker安装步骤

    本文是根据docker官方文档翻译,原文:https://docs.docker.com/engine/installation/linux/ubuntulinux/ Docker 支持以下 Ubun ...

  2. Linux(Ubuntu)环境下使用Fiddler

    自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...

  3. 多线程编程之Linux环境下的多线程(三)

    前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linu ...

  4. 多线程编程之Linux环境下的多线程(一)

    一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...

  5. Go学习笔记(一):Ubuntu 环境下Go的安装

    本文是根据<Go Web 编程>,逐步学习 Ubuntu 环境下go的安装的笔记. <Go Web 编程>的URL地址如下: https://github.com/astaxi ...

  6. Ubuntu环境下SSH的安装及使用

    Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机 ...

  7. Ubuntu环境下的Redis 配置与C++使用入门

      Redis是一个高性能的key-value数据库. Redisedis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用.它 ...

  8. ubuntu 环境下的QT程序打包

    很多的时候 需要将自己写的QT 程序发布一下  所以今天教一下 怎么在ubuntu 环境下将自己的写的Qt 程序打包打包是为了不依赖 开发环境 和开发的库. 1. QtCreate使用Release版 ...

  9. ubuntu环境下eclipse的安装以及hadoop插件的配置

    ubuntu环境下eclipse的安装以及hadoop插件的配置 一.eclipse的安装 在ubuntu桌面模式下,点击任务栏中的ubuntu软件中心,在搜索栏搜索eclipse 注意:安装过程需要 ...

随机推荐

  1. 兼容性:Adapter(适配器模式)【PHP】

    Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...

  2. Web前端-Vue.js必备框架(五)

    Web前端-Vue.js必备框架(五) 页面组件,商品列表组件,详情组件,购物车清单组件,结算页组件,订单详情组件,订单列表组件. vue-router 路由 vuex 组件集中管理 webpack ...

  3. vue学习笔记3

    Vue.js - Day3 定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即 ...

  4. C#常见金额优选类型及其三种常用的取整方式

    这两天一直在做一个商城后台的对账方面的工作,忽然发现C#真的有很多值的学习的东西: 一.C#常用的三种取整方式(主要适用于double.decimal.float这一类型的数据): Math.Roun ...

  5. Exception: Exception caught in workbook destructor. Explicit close() may be required for workbook. 错误解决办法

    # 写入表格 writer = pd.ExcelWriter('data.xlsx') new_df.to_excel(writer, sheet_name='sheet', index=True) ...

  6. java基础(十八)----- java动态代理原理源码解析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...

  7. 【Android Studio安装部署系列】二十三、Android studio查看Gradle版本号

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 File——Project Structure 单击Project 可以看到,当前项目的gradle版本号是4.4. 参考资料 An ...

  8. MyX5TbsDemo【体验腾讯浏览服务Android SDK (完整版)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 按照官网上的说明:可独立下载x5内核,也可共享使用微信或手Q的x5内核. 本Demo在引用腾讯X5内核的基础上进行了封装.参考< ...

  9. webpack-插件机制杂记

    系列文章 Webpack系列-第一篇基础杂记 webpack系列-插件机制杂记 前言 webpack本身并不难,他所完成的各种复杂炫酷的功能都依赖于他的插件机制.或许我们在日常的开发需求中并不需要自己 ...

  10. c# aes,des,md5加密等解密算法

    一:可逆加密,即是能加密也能解密 对称可逆加密:加密后能解密回原文,加密key和解密key是一个 加密算法都是公开的,密钥是保密的, 即使拿到密文 你是推算不了密钥 也推算不了原文 加密解密的速度快, ...