/****************** 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/