上一篇博客中的程序实现了半双工通信方式,主要原因是socket接收功能需要长期占用主进程,以至于影响了发送功能和用户界面的使用。
可以将发送、接收进程放在线程中,并由主线程实现线程调度。需要注意的是,多个线程可能同时读/写一段内存或者一个文件,此时需要加锁以防止数据混乱。最简单的锁是互斥锁。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#define BUFSIZE 64 //缓冲区容量
#define CACHECNT 16 //暂存字符串数目
/*用于线程间数据共享的结构体,只读的值传递,读写到指针传递*/
typedef struct
{
int sockfd;//socket标识符
int *cacheNum;//缓存计数器
pthread_mutex_t *mutex;//互斥锁
char filePath[BUFSIZE];//发送文件进程所使用的文件路径
char (*cache)[BUFSIZE];//数据接收缓存
}ThdShare;
//接收线程运行函数
void *recvThdRun(void *in)
{
char buf[BUFSIZE];
ThdShare thdShare = *(ThdShare*)(in);
for(;;)
{
memset(buf,0,sizeof(buf));
if(recv(thdShare.sockfd,buf,sizeof(buf),0) <=0)
{
perror("[error]Recv failed");
pthread_exit(0);
}
else
{
pthread_mutex_lock(thdShare.mutex);//为缓冲和缓冲计数器加锁
*(thdShare.cacheNum) +=1;
strcpy((thdShare.cache)[*(thdShare.cacheNum)],buf);
pthread_mutex_unlock(thdShare.mutex);//解锁
printf(