简单示例,有不对的地方,欢迎指点。
服务器端
/*
============================================================================
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;
}
运行结果:
分享到:
相关推荐
于一体的160多段代码实例,帮助读者快速掌握在Linux平台下进行C语言程序开发的方法和技巧,并通 过一个原创的BT软件下载综合案例的讲解,引导读者具备开发大型应用程序的能力。 《LinuxC编程实战》内容翔实,主要...
在linux上分别用多进程和多线程实现的同步互斥操作(源代码)
《Linux C编程实战》内容翔实,主要包括:Linux系统下C语言及其编程环境的介绍,系统编程的所有主题——文件和目录、进程、线程、信号、进程间通信、网络编程和图形界面编程、出错处理、库的创建与使用、编写安全的...
主要介绍了linux下的CC++多进程多线程编程实例详解的相关资料,需要的朋友可以参考下
全书由13章组成,内容涉及到Lindx系统编程基础、TCP/UDP协议、套接字编程概念及I/O模型、高级编程中需要用到的进程问通信同步、多路复用、多线程编程和一些高级套接字控制方法、IPv6介绍以及网络安全等。...
本书内容翔实,主要包括:Linux系统下C语言及其编程环境的介绍,系统编程的所有主题——文件和目录、进程、线程、信号、进程间通信、网络编程和图形界面编程、出错处理、库的创建与使用、编写安全的代码等。...
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 线程中使用信号...
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进程编程,多线程编程,TCP网络通信编程,定时器编程,文件编程等部分,全部为实例化代码,都已经编译通过!
详细介绍了Linux下C语言开发环境、C语言开发工具、内存管理、ANSI C文件I/O管理、POSIX文件I/O管理、文件及目录管理、进程管理、 UNIX进程间通信机制、System V进程间通信、多线程编程、线程间通信机制和Linux ...
详细介绍了Linux下C语言开发环境、C语言开发工具、内存管理、ANSI C文件I/O管理、POSIX文件I/O管理、文件及目录管理、进程管理、UNIX进程间通信机制、System V进程间通信、多线程编程、线程间通信机制和Linux Socket...
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 线程中使用信号...
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网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;...
第9章 多线程编程 9.1 Linux下线程概述 9.2 Linux线程实现 9.3 实验内容——“生产者消费者”实验 本章小结 思考与练习 第10章 嵌入式Linux网络编程 10.1 TCP/IP协议概述 10.2...
作为一名程序员,学习Linux C程序是必不可少的。本文将从零开始,详细讲解Linux C程序的基础知识和实例...线程和同步是多任务编程中非常重要的部分,也是编写高质量程序的关键之一。本节将深入讲解线程和同步相关知识。
实验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 ...
第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在嵌入式系统...