本来做的是开发板与PC端的多摄像头视频监控,但开发板处出现USB冲突,不好调试,故先做本地图片传输,以方便进行客户端和服务器端socket通信的调试。稍后再解决开发板端的USB 的HUB 冲突。
服务器端sever.c:
1.main()函数,开设线程
pthread_create( &id1, NULL, ( void* )thread1, NULL );
pthread_create( &id2, NULL, ( void* )thread2, NULL );
并阻塞主线程
while(1){
sleep(5);
printf( “ this is the main process!/n”);}
执行两个线程
pthread_join( id1, NULL );
pthread_join( id2, NULL );
2.thread1, thread2的实现
调用thread( thread_Num )
void thread1( void ){
int thread_Num = 1;
thread();}
void thread2( void ){
int thread_Num = 2;
thread();}
3. thread( int thread_Num)的实现
根据线程号判断要打开的图片,并把该图片的FILE型指针赋给fp_jpg;用stat( “filename.jpg”,&sb ) 计算图片大小( 注:sb是一个结构体,struct stat sb; ),并用地板函数floor( sb.st_size/1024)求出用socket需要传送的次数,再用sb.st_size%1024取余,得出最后一次socket需要传送的字节数。然后用severSocket( FILE *fd_send, int times, int last, int thread_Num )开始进行图片数据的传送。
4. severSocket( FILE *fd_send, int times, int last, int thread_Num )的实现
以上都是socket传送图片的准备工作,现在这个函数即是让socket真正传送数据的实现。
1)建立Ipv4地址
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
if(thread_Num == 1)
{sin.sin_port = 8000;}//线程1对应的传输端口
else
{sin.sin_port = 8001;}//线程2对应的传输端口
sin.sin_addr.s_addr = htonl( INADDR_ANY );
2)建立socket
sockfd=socket(AF_INET, SOCK_STREAM, 0);
3)绑定IPv4 地址
if(bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{printf("IPv4 bind failure!/n");}
printf("IPv4 build success!/n");
4)通知内核,监听client 连接请求
if(listen(sockfd, 5) < 0)
{printf("Listen failure!/n");}
printf("Listen success!/n");
5)处理client连接请求
conSock = accept(sockfd, (struct sockaddr *)&pin, &addrsize);
if(conSock < 0)
{printf("Accept failure!/n");}
else 就开始真正的socket通信
1) 传送所传图片的一共需要传送的次数times
2) 做times次循环,没次传送1024字节;
3) 传送最后的小于1024字节的数据(即前面取余所得值)。
关闭socket。