我正在编写一个程序来检查端口是否在C中打开.特别是一行将其中一个参数复制到char数组中.但是,当我尝试编译时,它说:
错误:赋值中的类型不兼容
继承人的代码.错误在于分配addr
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
u_short port; /* user specified port number */
char addr[1023]; /* will be a copy of the address entered by u */
struct sockaddr_in address; /* the libc network address data structure */
short int sock = -1; /* file descriptor for the network socket */
port = atoi(argv[1]);
addr = strncpy(addr, argv[2], 1023);
bzero((char *)&address, sizeof(address)); /* init addr struct */
address.sin_addr.s_addr = inet_addr(addr); /* assign the address */
address.sin_port = htons(port); /* translate int2port num */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sock,(struct sockaddr *)&address,sizeof(address)) == 0) {
printf("%i is open\n", port);
}
if (errno == 113) {
fprintf(stderr, "Port not open!\n");
}
close(sock);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我是C的新手,所以我不确定为什么会这样做.
addr 是一个数组,所以你不能直接分配它.
更改addr = strncpy(addr, argv[2], 1023);到strncpy(addr, argv[2], 1023);
返回指向您传入的内容的指针,但不需要此值.strncpy单独调用将字符串复制argv[2]到addr.
注意:我注意到有时你会传入数组的地址,有时你传入的数组本身没有运算符的地址.
当参数只要求char*...时
虽然两者都可以传递addr而不是&addr更正确.&addr给出一个指向char数组的指针,char (*)[1023]同时addr给出一个char*第一个元素的地址.它通常没关系,但如果你做指针运算,那么它将产生很大的不同.
您已经得到了几个答案,可以准确地解决您的问题.我的建议是退后一步,消除这一步,因为它完全没必要.我会更改这些行:
u_short port; /* user specified port number */
char addr[1023]; /* will be a copy of the address entered by u */
struct sockaddr_in address; /* the libc network address data structure */
port = atoi(argv[1]);
addr = strncpy(addr, argv[2], 1023);
bzero((char *)&address, sizeof(address)); /* init addr struct */
address.sin_addr.s_addr = inet_addr(addr); /* assign the address */
address.sin_port = htons(port); /* translate int2port num */
Run Code Online (Sandbox Code Playgroud)
这样的事情:
struct sockaddr_in address = {0};
address.sin_port = htons(atoi(argv[1]));
address.sin_addr.s_addr = inet_addr(argv[2]);
Run Code Online (Sandbox Code Playgroud)
现有代码正在进行大量不必要的复制,使代码变得更大更慢,而无需完成任何操作.
编辑:再看一遍,你应该添加一些错误检查代码(在上面的内容之前),例如:
if (argc != 3) {
fprintf(stderr, "Usage: %s <port_num> <address>", argv[0]);
return EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4473 次 |
| 最近记录: |