//positve.c //对tcp和udp均适用
#include
#include
#include
#include
#include
#include
void error(int status, int err,char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if(err)
fprintf(stderr,":%s(%d)/n",strerror(err),err);
if(status)
exit(status);
}
static void set_address(const char * hname, const char *sname,
struct sockaddr_in *sap, char *protocol) {
struct servent *sp;
struct hostent *hp;
short port;
bzero(sap, sizeof(*sap));
sap->sin_family = AF_INET;
if(hname != NULL) {
if(!inet_aton(hname, sap->sin_addr)) {
hp = gethostbyname(hname);
if(hp == NULL)
error(1, 0, "unkown host %s", hname);
sap->sin_addr = *(struct in_addr *)hp->h_addr;
}
}
else
sap->sin_addr.s_addr = htonl(INADDR_ANY);
if (sp = getservbyname(sname, protocol))
sap->sin_port = sp->s_port;
else if ((sap->sin_port = htons((short)atoi(sname))) == 0)
error(1,0,"unkown serivce %s", sname);
}
int client(char *hname, char *sname,
struct sockaddr_in * server , char *protocol) {
int s,type;
const int on = 1;
if(strcmp(protocol,"tcp")==0)
type = SOCK_STREAM;
else
type = SOCK_DGRAM;
if((s=socket(AF_INET, type, 0)) <= 0)
error(1, 0, "create socket failed!");
set_address(hname, sname, server, protocol);
if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
error(1,errno,"setsocket option failed!");
if((type==SOCK_STREAM)
&&connect(s,(struct sockaddr *)server,sizeof(*server)))
error(1, errno, "connect error!");
return s;
}
//tcpclient.c
#include
#include
#include
#include
#include
#include
#include
#include