加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

I / O通信从客户端到服务器程序进行读写

发布时间:2020-12-16 06:51:46 所属栏目:百科 来源:网络整理
导读:所以我正在玩端口和客户端/服务器通信的想法. 我有一个server.c程序,可以打开一个端口,打开一个监听描述符,并在收到连接后,派一个孩子来处理与连接客户端的通信.我有一个client.c程序,它接受5个命令行参数.基本上前3个参数是要发送到服务器的练习字符串,第4
所以我正在玩端口和客户端/服务器通信的想法.

我有一个server.c程序,可以打开一个端口,打开一个监听描述符,并在收到连接后,派一个孩子来处理与连接客户端的通信.我有一个client.c程序,它接受5个命令行参数.基本上前3个参数是要发送到服务器的练习字符串,第4个是主机名,第5个是端口号.

到目前为止连接这两个工作正常,但是,当客户端尝试将3个不同的字符串(argv [1],argv [2]和argv [3])写入server.c时,server.c似乎只是能够读取第一个然后它似乎被卡住而不继续使用额外的读取,即使客户端将完成将所有字符串写入通信文件描述符.我已经被困4个多小时,试图找出应该是一个简单的练习程序来更好地学习服务器和客户端.我不想再迷路了然后我已经这样了我希望有人可以给我任何关于如何处理这个问题或者我做错了什么的建议.

Client.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "uici.h"
#include "func.h"


int main(int argc,char *argv[]){
  int fd;
  u_port_t portnum;

  if(argc != 6){
    fprintf(stderr,"Usage: %s string1 string2 string3 host portn",argv[0]);
    return -1;
  }
  portnum = (u_port_t)atoi(argv[5]);
  if((fd = u_connect(portnum,argv[4])) == -1){
    perror("Failled to establish connection");
    return 1;
  }
  fprintf(stderr,"[%ld]:connection made to %sn",(long)getpid(),argv[4]);
  if((write(fd,argv[3],strlen(argv[3])+1)) == -1){
    fprintf(stderr,"Failed to write %s to fd",argv[3]);
    r_close(fd);
    return 0;
  }
  if((write(fd,argv[1],strlen(argv[1])+1)) == -1){
    fprintf(stderr,argv[1]);
    r_close(fd);
    return 0;
  }
  if((write(fd,argv[2],strlen(argv[2])+1)) == -1){
    fprintf(stderr,argv[2]);
    close(fd);
    return 0;
  }
  fprintf(stderr,"Everything has been writtenn");
  return 0;
}

Server.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "func.h"
#include "uici.h"

int main(int argc,char *argv[])
{
   u_port_t portnumber;
   int listenfd;
   int fd;
   char client[MAX_CANON];
   int bytes_copied;
   pid_t child;

   if (argc != 2) {
      fprintf(stderr,"Usage: %s portn",argv[0]);
      return 1;
   }

   portnumber = (u_port_t) atoi(argv[1]);
   if ((listenfd = u_open(portnumber)) < 0) {
      perror("Listen endpoint creation failed");
      return 1;
   }

   fprintf(stderr,"[%ld]: Waiting for the first connection on port %dn",(int)portnumber);
   for ( ; ; ) {
      if ((fd = u_accept(listenfd,client,MAX_CANON)) != -1) {
         fprintf(stderr,"[%ld]: A connection has been received from %sn",(long) getpid(),client);
         if ((child = fork()) == -1)
            perror("Could not fork a child");

         if (child == 0) {                            /* child code */
            r_close(listenfd);
            int MAXSZ = 1024;
            char str3[MAXSZ];
            char str1[MAXSZ];
            char str2[MAXSZ];
            int bytesread = 0;
            fprintf(stderr,"Beginning the readsn");
            read(fd,str3,MAXSZ);
            fprintf(stderr,"Finished 1st readn");
            read(fd,str1,"Finished 2nd readn");
            read(fd,str2,"str3: %sn",str3);
            fprintf(stderr,"str1 = %sn",str1);
            fprintf(stderr,"str2 = %sn",str2);
            close(fd);
            return 0;
         } else {                                    /* parent code */
            close(fd);
            while (waitpid(-1,NULL,WNOHANG) > 0) ;  /* clean up zombies */
         }
      }
      else
         perror("Accept failed");
   }
}

解决方法

分叉的第一个子项用r_close(listenfd)关闭监听器;

然后当客户端发送argv [1]没有可用的监听器时,我认为,u_accept(listenfd,MAX_CANON)因listenfd无效而返回错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读