c - 在命令行参数中处理 IP 地址时出错

标签 c

/****************** CLIENT CODE ****************/ socket connection

int main( int argc,char *argv[] )// main function
{
        int opt,port,i=0,j=1,addr_size;
        int clientSocket;
        char buffer[MAX];
        char server_ip[9];
        struct sockaddr_in serverAddr;

        while ((opt = getopt (argc, argv, "p:i:")) != -1)
        {
                switch (opt)
                {
                case 'p':
                        port=atoi(optarg);
                        break;
                case 'i':
                        i=atoi(optarg);
                        break;

//注释 strcpy 和硬编码 ip 地址工作没有任何问题。如果尝试从命令行对其进行 strcpy,它会连接到服务器并挂起下面的 while 循环

                //case 'a':
                //      strcpy(server_ip,optarg);
                //      break;
                deault:
                        printf ("No arguments\n");
                        exit(0);
                }
        }

        clientSocket = socket(AF_INET, SOCK_STREAM, 0);
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(port);
        serverAddr.sin_addr.s_addr = inet_addr("10.0.2.15");
        addr_size = sizeof (serverAddr);

        connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);

        j=1;

        while(j<=i)
        {

                send(clientSocket,"Client1",MAX,0);

                if(recv(clientSocket, buffer, 1024, 0)>0)
                        printf("Data received: %s\n",buffer);
                j++;
                sleep(1);
        }
        return 0;
}

最佳答案

char server_ip[9];

不够大,IP4 地址最长为 15 个字符,\0 为一个字符,因此您应该将变量声明为

char server_ip[16];

即使您输入 10.0.2.15,您也少了一个字符,因为考虑到空字符,它需要 10 个字符来存储此 ip。

您可能会在这里遇到另一个未定义的行为:

        send(clientSocket,"Client1",MAX,0);

如果 MAX 大于 7(“Client1”的长度),send() 将尝试读取超出字符串文字“Client1”范围的内容。 您应该将正确的发送缓冲区及其大小传递给 send() 函数,您应该更正这些导致未定义行为的情况并重试

关于c - 在命令行参数中处理 IP 地址时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47525037/

相关文章:

objective-c - Objective c UIImage 到 char* 转换返回空字符串

c - 将 cstring 作为参数传递,以便它可以被覆盖

c - 使用函数指针和静态变量时是否需要读锁?

c - 浮点乘法溢出

管道多个命令的 C 程序

python - 检测用户何时完成 GTK 窗口的移动/调整大小

c - 多数元素。如果有人能指出错误,那将非常有帮助

Ctrl + C 处理程序在某些主机上工作而不在其他主机上工作

c - char* 和 char[] 与 strcpy() 的区别

c - 我 undefined reference 已定义