linaisijia 2019-09-23 13:54 采纳率: 100%
浏览 207
已采纳

需要制作一个tcp计算器,客户端出了问题

1.不删除 下面这段代码的话,会出错.
if (argc !=2){ //number of parameters wrong
perror("Input: ./server12 to use");
exit(1);
}
2.删除了之后,可以编译但运行的时候会提示Segmentation fault (core dumped);
3.修改了 servaddr.sin_addr.s_addr= inet_addr(argv[1]);改为htonl(INADDR_ANY),2的错误已经解决,但是网络连接失败..Fail to connect to the server: Connection refused
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define SERV_PORT 10010

int main(int argc, char **argv) {/

    int sockfd;
    struct sockaddr_in servaddr;
    char recvmsg[MAXLINE];
    unsigned num1, num2, result;
    char operator, valid;
    char str1[] = "Valid", str2[] = "Invalid", valid_s[10];
    char sendmsg[MAXLINE];



if (argc !=2){ 
  perror("Input: ./server12 <IP address of the server> to use");
  exit(1);
}


if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0){
  perror("Socket initialize failed");
  exit(2);
}

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr= inet_addr(argv[1]);/
servaddr.sin_port =  htons(SERV_PORT);


if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0){
  perror("Problem in connecting to the server");
  exit(3);
}

while(1){


    printf("%s\n", "Please enter the first integer");
    while (scanf("%u", &num1) != 1){
            while(getchar() != '\n');
            printf("%s\n", "Input type illegal");
            printf("%s\n", "Please enter the first integer again");

    }

    while(getchar() != '\n');



    // get operation
    printf("%s\n", "Please enter the operation ");
    while((scanf("%c", &operator)!= 0) && (operator !=43 &&operator != 45 && operator!= 120 && operator!=47)){
            while(getchar() != '\n');
            printf("%s\n", "Operator is illegal or does not exist");
            printf("%s\n", "Please check the input");
    }

    while(getchar() != '\n');


    // get the second number to operate
    printf("%s\n", "Please enter the second integer");
    while (scanf("%u", &num2) != 1){//check input type
            while(getchar() != '\n');
            printf("%s\n", "Input type illegal");
            printf("%s\n", "Please enter the second integer again");
    }

    while(getchar() != '\n');




    memcpy(sendmsg, &operator, 1);
    memcpy(sendmsg + 1, &num1, 4);
    memcpy(sendmsg + 5, &num2, 4);


    //send message
    send(sockfd, sendmsg, MAXLINE, 0);
    printf("Message sent to the server: %u %c %u\n", num1, operator, num2);



    if (recv(sockfd, recvmsg, MAXLINE,0) == 0){ 

            perror("The server has terminated ");
            exit(4);
    }else{




    memcpy(&result, recvmsg + 9, 4);



    valid = recvmsg[13];



    if(valid == '1'){//success
      strncpy(valid_s, str1, sizeof(str1));
    }else//failed
    {
      strncpy(valid_s, str2, sizeof(str2));
    }
    printf("Result: %u %c %u = %d, %s.\n", num1, operator, num2, result, valid_s);//print the result
  }
}

exit(0);
}

  • 写回答

3条回答

  • qtchen_1988 2019-09-23 15:28
    关注

    1.你说的第一点,是因为参数个数不是2个,就直接退出程序了,因此不会出错;
    2.第二点是说明段错误了,引用了argv[1],因为argv[1]现在是NULL;
    3.修改后是因为没用到argv[1],所以不会段错误。
    你运行的时候有没有带参数?明显是没带参数出的问题。如果你在Linux系统,假设你的程序名为 tcp_cli 试着这样运行: ./tcp_cli 127.0.0.1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图