Вы получили пару ответов, которые точно соответствуют тому, что вы спрашивали.Мой совет - сделать шаг назад и просто исключить этот шаг, так как он совершенно не нужен.Я бы изменил эти строки:
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 */
на что-то вроде этого:
struct sockaddr_in address = {0};
address.sin_port = htons(atoi(argv[1]));
address.sin_addr.s_addr = inet_addr(argv[2]);
Существующий код выполняет много ненужного копирования, делая код больше и медленнее, не выполняя ничего.
Редактировать: глядя на это снова, вы, вероятно, должны добавить немного кода проверки ошибок (до того, что выше), что-то вроде:
if (argc != 3) {
fprintf(stderr, "Usage: %s <port_num> <address>", argv[0]);
return EXIT_FAILURE;
}