Cercherò di essere piu chiaro.

argv[] è definito come char**. Questo vuol dire che è una matrice di caratteri, che puoi vedere anche come un array di stringhe. accedere ad argv[2] significa accedere alla stringa di indice 2 nell'array. ma quello che è importante è che sono stringhe.

La funzione htons() invece accetta un parametro di tipo u_short (tipo intero short senza segno).

Quello che nn puoi fare è passare una stringa a una funzione ceh accetta un intero.
Il compilatore ti avvisa che per dare la stringa alla funzione dovrà fare un cast (cioè cambiare il tipo del parametro) da char* a int (cioè da puntatore a intero).

Tipicamente con una conversione di questo tipo ti ritrovi con dei valori che non significano niente il che rende inconsistente il programma che stai facendo.

Devi quindi trasformare la stringa in un valore intero prima di passarla ad htons(). per fare ciò puoi utilizzare la funzione atoi() e devi anche castare il tipo intero cosi ricevuto in un tipo u_short.

codice:
serveraddr.sin_port=htons((u_short)atoi(argv[2]));
Per l'altro errore cosi a occhio penso a un problema di assegnazione di un valore intero a una union, ma potrei sbagliarmi. Posta l'errore completo che ti da in quel punto e cerchiamo di capire.