Linux网络进程通信实验小结

实验要求:实现一个远程编译系统

执行过程:客户端提交c语言代码文件,在服务端编译连接,服务端执行文件后把结果返回给客户端。

细节说明:

(1)在执行外部命令时,要在该函数下创建子进程。

if ((cpid = fork()) != 0 )
{
      
return 0;
}

else
{
      execl(argv[
0], argv[1], argv[2], (char *)0);
      exit(
0);
}

(2)服务端在接收客户端传送的二进制流时,为了同步,需要等待;否则,经过实验,会造成服务端数据丢失。

while ( ! flag)
{
     
if(recv(tsockfd, package, 10240)<0)
     
{
          perror(
"recv");
          exit(
1);
     }

     
else
     
{
          flag
=1;
     }

}

(3)由于socket传输的是二进制流,所以在接收字符串时要在数据结尾增加“字符串结束符”。

numb = recv(tsockfd, str,  10 0 );
if (numb < 0 )
{
     perror(
"recv");
     exit(
1);
}

str[numb]
= '/0';

(4)服务端接收客户端的数据时,除了创建子进程外,还需要通过管道进行进程内通信,用来传送子进程运行的结果。

if (pipe(fd) ==- 1 )
{
     printf(
"create pipe error! ");
     exit(
1);
}

switch (child_pid = fork())

     
case 0:
     
{
          close(fd[
0]);
          
if(put()==0)
          
{
               sprintf(reply, 
"upload successfully!");
               write(fd[
1], reply, strlen(reply));
          }

          
else
          
{
               sprintf(reply, 
"upload error!");
               write(fd[
1], reply, strlen(reply));
          }

          exit(
0);
          
break;
     }

     
case -1:
     
{
         perror(
"fork error");
         
break;
     }

     
default:
     
{
           
int len;
           close(fd[
1]);
           len
=read(fd[0], reply, sizeof(reply));
           reply[len]
='/0';
        }
  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值