`
从此醉
  • 浏览: 1039335 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

Linux 下 C 网络编程之 多线程通信 实例

 
阅读更多

简单示例,有不对的地方,欢迎指点。


服务器端

/*
 ============================================================================
 Name        : sockThreadServer.c
 Author      : gaotong
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <string.h>
#define gettid() syscall(__NR_gettid) //获得线程ID

void * handler_conn(void * arg) {
	char send_str[100];
	int client_sock_fd = *(int *) arg;
	char recv_str[100];
	//printf("thread run success \n");
	while (1) {
		read(client_sock_fd, recv_str, 100);

		//如果对方发来exit 就断开连接
		if (strcmp(recv_str, "exit") == 0) {
			break;
		}
		printf("receive from %d : %s \n", client_sock_fd, recv_str);
		int id = gettid(); // 得到线程ID

		sprintf(send_str, "这是线程:%d,你好,client_sock_fd:%d\n", id, client_sock_fd);

		if(write(client_sock_fd, send_str, 100) == -1){
			perror("send error"); //客户端关闭连接
			break;
		}

		printf("我说: %s \n", send_str);

	}

	free(arg);
	puts("断开连接\n");
	close(client_sock_fd);
	pthread_exit(0);
}

int main(void) {

	int * client_sockfd;
	int server_len, client_len;
	struct sockaddr_in server_address;
	struct sockaddr_in client_address;
	struct sockaddr_in tempaddr;


	server_address.sin_family = AF_INET;
	server_address.sin_port = htons(1991);
	server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

	//创建一个socket
	int sock_fd = socket(AF_INET, SOCK_STREAM, 0);

	//绑定
	bind(sock_fd, (struct sockaddr *) &server_address, sizeof(server_address));

	listen(sock_fd, 20);

	while (1) {
		pthread_t thread; //每连接一个client 就创建一个线程

		puts("监听等待:…………\n");
		//client_sockfd 需要作为一个指针,传给线程。以便每个线程都能控制自己的连接
		client_sockfd = (int *) malloc(sizeof(int));

		client_len = sizeof(client_address);

		//int accept (int socket, struct sockaddr *addr, socklen_t *length_ptr)
		*client_sockfd = accept(sock_fd, (struct sockaddr *) &client_address,
				(socklen_t *) &client_len);

		printf("client connected ! %d \n", *client_sockfd);

		pthread_create(&thread, NULL, handler_conn, client_sockfd);

		puts("线程创建\n");
	}

	return EXIT_SUCCESS;
}



客户端:

/*
 ============================================================================
 Name        : sockThreadClient.c
 Author      : gaotong
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

int client_sockfd;
char recv_str[100];

void * getMsg(void * arg){
	int test;
	while( (test =read(client_sockfd, recv_str, 100)) != EOF){

		if(test == 0) //服务器关闭连接
			break;
		if(test == -1)
		{
			printf("read error!");
			break;
		}
		printf("收到服务器消息:%s\n",recv_str);
	}

	close(client_sockfd);
	pthread_exit(0);
}

int main(void) {

	char char_send[100];

	//创建一个socket
	client_sockfd = socket(AF_INET, SOCK_STREAM , 0);

	struct sockaddr_in serverAddr; //服务器地址
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(1991);

	connect(client_sockfd,(struct sockaddr *)&serverAddr, sizeof(serverAddr));

	pthread_t pt;
	pthread_create(&pt, NULL, getMsg, NULL);

	while(1){
		gets(char_send); //从控制台读入要发送的数据
		//int send (int socket, void *buffer, size_t size, int flags)
		if(send(client_sockfd, char_send,sizeof(char_send),0) == -1){
			break;
		}
		printf("我对服务器说:%s\n",char_send );

		if(strcmp(char_send, "exit") == 0){ // 输入exit 退出
			break;
		}
	}

	close(client_sockfd);

	return EXIT_SUCCESS;
}



运行结果:




分享到:
评论

相关推荐

    LinuxC编程实战电子书

    于一体的160多段代码实例,帮助读者快速掌握在Linux平台下进行C语言程序开发的方法和技巧,并通 过一个原创的BT软件下载综合案例的讲解,引导读者具备开发大型应用程序的能力。  《LinuxC编程实战》内容翔实,主要...

    linux上实现多进程和多线程实现同步互斥(源代码)

    在linux上分别用多进程和多线程实现的同步互斥操作(源代码)

    《Linux C编程实战》.(童永清).pdf带标签

    《Linux C编程实战》内容翔实,主要包括:Linux系统下C语言及其编程环境的介绍,系统编程的所有主题——文件和目录、进程、线程、信号、进程间通信、网络编程和图形界面编程、出错处理、库的创建与使用、编写安全的...

    linux下的C\C++多进程多线程编程实例详解

    主要介绍了linux下的CC++多进程多线程编程实例详解的相关资料,需要的朋友可以参考下

    linux programming instances网络编程教程 附源代码

    全书由13章组成,内容涉及到Lindx系统编程基础、TCP/UDP协议、套接字编程概念及I/O模型、高级编程中需要用到的进程问通信同步、多路复用、多线程编程和一些高级套接字控制方法、IPv6介绍以及网络安全等。...

    Linux C编程实战.童永清(带详细书签)

     本书内容翔实,主要包括:Linux系统下C语言及其编程环境的介绍,系统编程的所有主题——文件和目录、进程、线程、信号、进程间通信、网络编程和图形界面编程、出错处理、库的创建与使用、编写安全的代码等。...

    linux网络编程-宋敬彬-part3

    4.4.1 多线程编程实例 127 4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号...

    linux网络编程-宋敬彬-part2

    4.4.1 多线程编程实例 127 4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号...

    linux 程序开发实例

    该资源涵盖了Linux进程编程,多线程编程,TCP网络通信编程,定时器编程,文件编程等部分,全部为实例化代码,都已经编译通过!

    Linux高级程序设计

    详细介绍了Linux下C语言开发环境、C语言开发工具、内存管理、ANSI C文件I/O管理、POSIX文件I/O管理、文件及目录管理、进程管理、 UNIX进程间通信机制、System V进程间通信、多线程编程、线程间通信机制和Linux ...

    Linux高级程序设计原代码 杨宗德等主编

    详细介绍了Linux下C语言开发环境、C语言开发工具、内存管理、ANSI C文件I/O管理、POSIX文件I/O管理、文件及目录管理、进程管理、UNIX进程间通信机制、System V进程间通信、多线程编程、线程间通信机制和Linux Socket...

    linux网络编程-宋敬彬-part1

    4.4.1 多线程编程实例 127 4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号...

    网络编程实用教程(第三版).zip

    7.2.3 多线程机制在网络编程中的应用 191 7.3 VC++对多线程网络编程的支持 192 7.3.1 MFC支持的两种线程 192 7.3.2 创建MFC的工作线程 193 7.3.3 创建并启动用户界面线程 195 7.3.4 终止线程 198 7.4 ...

    Linux高性能服务器编程

    包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;...

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

    第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux线程实现   9.3 实验内容——“生产者消费者”实验   本章小结   思考与练习  第10章 嵌入式Linux网络编程   10.1 TCP/IP协议概述   10.2...

    学习linux环境下c程序的示例代码.rar

    作为一名程序员,学习Linux C程序是必不可少的。本文将从零开始,详细讲解Linux C程序的基础知识和实例...线程和同步是多任务编程中非常重要的部分,也是编写高质量程序的关键之一。本节将深入讲解线程和同步相关知识。

    嵌入式Linux程序设计案例与实验教程-实例代码

    实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关函数25 2.4.3 信号概述27 2.4.4 信号的相关函数27 2.4.5 管道概述27 2.4.6 ...

    Linux C程序设计大全

    第1篇 Linux下C语言基础 第1章 Linux简介 1.1 GNU简介 1.2 Linux简介 1.2.1 Linux发展史 1.2.2 Linux发行版 1.2.3 Linux内核版本 1.2.4 Linux与UNIX的关系 1.2.5 Linux在服务器方面的发展 1.2.6 Linux在嵌入式系统...

Global site tag (gtag.js) - Google Analytics