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 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站