利用多线程实现linux下C语言的聊天室程序:
转载:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml
利用多线程实现linux下C语言的聊天室程序:
客户端代码:
threadsend线程负责客户端消息的发送;
threadrecv线程负责客户端接受服务器端的消息。
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <arpa/inet.h>
- #include <pthread.h>
- #define MAXLINE 100;
- void *threadsend(void *vargp);
- void *threadrecv(void *vargp);
- int main()
- {
- int *clientfdp;
- clientfdp = (int *)malloc(sizeof(int));
- *clientfdp = socket(AF_INET,SOCK_STREAM,0);
- struct sockaddr_in serveraddr;
- struct hostent *hp;
- bzero((char *)&serveraddr,sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(15636);
- serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
- printf("connect error\n");
- exit(1);
- }
- pthread_t tid1,tid2;
- printf("connected\n");
- while(1){
- pthread_create(&tid1,NULL,threadsend,clientfdp);
- pthread_create(&tid2,NULL,threadrecv,clientfdp);
- }
- return EXIT_SUCCESS;
- }
- void *threadsend(void * vargp)
- {
- //pthread_t tid2;
- int connfd = *((int *)vargp);
- int idata;
- char temp[100];
- while(1){
- //printf("me: \n ");
- fgets(temp,100,stdin);
- send(connfd,temp,100,0);
- printf(" client send OK\n");
- }
- printf("client send\n");
- return NULL;
- }
- void *threadrecv(void *vargp)
- {
- char temp[100];
- int connfd = *((int *)vargp);
- while(1){
- int idata = 0;
- idata = recv(connfd,temp,100,0);
- if(idata > 0){
- printf("server :\n%s\n",temp);
- }
- }
- return NULL;
- }
服务器端代码:
threadsend负责服务器端发送信息;
threadrecv负责接受客户端信息。
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <arpa/inet.h>
- #include <pthread.h>
- #define PORT 15636
- void *thread(void *vargp);
- void *threadsend(void *vargp);
- void *threadrecv(void *vargp);
- int main()
- {
- int listenfd = socket(AF_INET, SOCK_STREAM,0);
- if(listenfd < 0){
- perror("socket");
- exit(1);
- }
- struct hostent *hp;
- struct sockaddr_in serveraddr;
- bzero((char *)&serveraddr,sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
- serveraddr.sin_port = htons(PORT);
- if(bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
- perror("connect");
- exit(1);
- }
- if(listen(listenfd,1024) < 0){
- perror("listen error");
- exit(1);
- }
- //char temp[100];
- struct sockaddr_in clientaddr;
- int clientlen, *connfdp;
- clientlen = sizeof(clientaddr);
- while(1){
- connfdp = (int *)malloc(sizeof(int));
- *connfdp = accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen);
- pthread_t tid;
- printf("Accepted!\n");
- pthread_create(&tid,NULL,thread,connfdp);
- }
- EXIT_SUCCESS;
- }
- void *thread(void *vargp)
- {
- pthread_t tid1,tid2;
- int connfd = *((int *)vargp);
- int idata;
- char temp[100];
- pthread_create(&tid1,NULL,threadsend,vargp);
- pthread_create(&tid2,NULL,threadrecv,vargp);
- return NULL;
- }
- void *threadsend(void * vargp)
- {
- int connfd = *((int *)vargp);
- int idata;
- char temp[100];
- while(1){
- //printf("server input: ");
- fgets(temp,100,stdin);
- send(connfd,temp,100,0);
- printf(" server send OK\n");
- }
- return NULL;
- }
- void *threadrecv(void *vargp)
- {
- char temp[100];
- int connfd = *((int *)vargp);
- while(1){
- int idata = 0;
- idata = recv(connfd,temp,100,0);
- if(idata > 0){
- printf("client :\n%s\n",temp);
- }
- }
- return NULL;
- }
问题:
linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread参数就可以了。
运行结果:
客户端:
- [root@localhost unixIO]# ./echoclient
- connected
- hello!
- client send OK
- goodmorning
- client send OK
- server :
- goodmorning too!
- server :
- how r u?
- fine
- client send OK
服务器端:
- [root@localhost unixIO]# ./echoserver
- Accepted!
- client :
- hello!
- client :
- goodmorning
- goodmorning too!
- server send OK
- how r u?
- server send OK
- client :
- fine
利用多线程实现linux下C语言的聊天室程序:相关推荐
- 基于Linux下的即时通讯聊天室项目(全代码 有注释 可直接运行)
基于Linux下的即时通讯聊天室项目 一.序言 二.具体功能 三.系统客户要求 四.具体代码 1.服务器代码 2.客户端代码 一.序言 最近在写一个基于Linux下的聊天工具 它适合于局域网内所有人进 ...
- Linux下使用c++实现聊天室
Linux使用c++我们会使g++来编码,使用gdb工具进行代码调试.同时在大型项目中,我们编写makefile来自动化编译. 知识点 使用 g++ 编译器编译代码 使用 gdb 进行调试 编写 ma ...
- Linux下socket多人聊天室
目录 前言 一.聊天室的实验内容 二.逐个功能的简单分析 三.系统功能模块分解图 1.服务端功能模块图 2.客户端功能模块图 3.守护进程功能模块图 四.功能模块流程图 1.服务端流程图 2.客户端流 ...
- 利用多线程与网络编程编写的实时聊天小程序
客户端代码: package Oracle; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- C语言网络聊天室程序
共分为四部分,服务器两个,客户端两个 1.my_sever.c //******************************************************// //鐢熸垚鏃ユ湡 ...
- 您知道Linux下C语言编程的一些注意事项吗_教育中国
您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...
- Linux下C语言编程
第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...
- 初识Linux下C语言编程
本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...
- Linux下C语言编程-进程的创建
Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...
最新文章
- 【C++】C++11 STL算法(二):修改序列的操作(Modifying sequence operations)
- 微软发布全新多核心操作系统原型:Barrelfish
- 选择器Selector
- 洗澡或游泳等导致的耳朵进水的解决方案
- oracle常用的知识点
- php 租房子(练习题)
- input type=file美化
- Atitit.常见的异常分类 目录 1. 双元分类法	1 1.1. 按照语言分 java js c# php等	1 1.2. 通用常见异常vs 特定异常	1 1.3. Runtime ex vs c
- 网 络 响 应 状 态 码 常 见 的 错 误 代 码 及 错 误 原 因
- java 密钥库 口令_java密钥库和密码设置
- 时间序列分析实验报告总结_时间序列分析实验报告
- python安装scipy库出错_安装Scipy失败 解决途径
- ps的基础知识与教程
- 哪款国产ESD二极管可直接替代LC3311CCW?
- 低成本快速开发 LoRa 终端:从 0 到 1
- MySql按中文姓名排序
- 20220215-CTF-MISC-BUUCTF-ningen--binwalk分析---dd命令分离--ARCHPR暴力破解
- Java是一种强类型语言
- 西门子标准变频器MM430_MM440参数组切换应用方法示例
- 妖精的尾巴勇气之旅服务器维护,妖精的尾巴勇气之旅b服
热门文章
- pat 甲级 1072. Gas Station (30)
- 20162303《程序设计与数据结构》第一周学习总结
- VM克隆之后启动eth0找不到eth0:unknown interface:no such device
- 内存泄露从入门到精通三部曲之排查方法篇
- idhttp.post方式 调用datasnap rest 远程方法
- python学习笔记四——数据类型
- Windows Phone 内容滑动切换实现
- erp 维护费 要交吗_erp系统每年都要缴费吗
- netapp管理地址_NetApp常用管理命令总结
- linux ntp 'ntp_request.c'远程拒绝服务漏洞,NTP 'ntp_request.c'远程拒绝服务漏洞