现在的位置: 首页 > 综合 > 正文

linux网络socket编程客户端端(tcp/udp)

2013年08月15日 ⁄ 综合 ⁄ 共 3128字 ⁄ 字号 评论关闭
//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);
}

抱歉!评论已关闭.