lijiji_1515: 本地多线程图片传输:server端

 

本来做的是开发板与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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值