//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 void process_client(int s) { char buff[128]; int rc,maxfd; fd_set rset; FD_ZERO(&rset); while(1) { FD_SET(s,&rset); FD_SET(0,&rset); maxfd=s+1; if(select(maxfd,&rset,NULL,NULL,NULL)==-1) error(1,0,"select error!"); if(FD_ISSET(s,&rset)) { rc = recv(s,buff,sizeof(buff),0); if(rc <= 0) break; buff[rc]='/0'; write(1,buff,rc); } if(FD_ISSET(0,&rset)) { if(fgets(buff,sizeof(buff),stdin)==NULL) shutdown(s,SHUT_WR); send(s,buff,strlen(buff),0); } } /* while(fgets(buff,sizeof(buff),stdin)!=NULL) { send(s,buff,strlen(buff),0); rc = recv(s,buff,sizeof(buff),0); if(rc <= 0) break; buff[rc]='/0'; write(1,buff,rc); bzero(buff,sizeof(buff)); } */ } int main(int argc, char **argv) { struct sockaddr_in server,temp; char *hname, *sname; int s, c, len; if(argc < 2) error(1,0,"parameters less than 2"); else if(argc == 2) { hname = NULL; sname = argv[1]; } else if(argc == 3) { hname = argv[1]; sname = argv[2]; } s = client(hname, sname, &server, "tcp"); len=sizeof(temp); getsockname(s,(struct sockaddr *)&temp,&len); printf("local %s:%d/n",inet_ntoa(temp.sin_addr),ntohs(temp.sin_port)); getpeername(s,(struct sockaddr *)&temp,&len); printf("remote %s:%d/n",inet_ntoa(temp.sin_addr),ntohs(temp.sin_port)); process_client(s); close(s); exit(0); } //udpclient.c #include #include #include #include #include #include void process_client(int s, struct sockaddr_in *server) { char buff[128]; int rc; struct sockaddr_in reply; int len; while(fgets(buff,sizeof(buff),stdin)!=NULL){ sendto(s, buff, strlen(buff),0, (struct sockaddr *)server, sizeof(*server)); rc=recvfrom(s,buff,sizeof(buff), 0, (struct sockaddr *)&reply,&len); buff[rc]='/0'; write(1,buff,rc); } } int main(int argc, char **argv) { struct sockaddr_in server; char *hname, *sname; int s, c, len; if(argc < 2) error(1,0,"parameters less than 2"); else if(argc == 2) { hname = NULL; sname = argv[1]; } else if(argc == 3) { hname = argv[1]; sname = argv[2]; } s = client(hname, sname, &server , "udp"); process_client(s, &server); close(s); exit(0); }
linux网络socket编程客户端端(tcp/udp)
最新推荐文章于 2024-11-25 16:12:08 发布