linux下TCP连接的client和server

http://blog.163.com/caipeipei_love@126/blog/static/2596603220101118433940/

 

基于TCP连接的client和server简单通信

我在看电子书,班主任来了说动手写个client和server的简单通信,只看是不行的,写好了给我看看,真的是一语点中了真理啊:只看不动手,什么时候都不会掌握的!

下午自己就动手写了一个:

主要是基于TCP的三次握手的,面向连接的client和server

tcpserver.c

#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#define portnumber 8080
int main(int argc ,char *argv[])
{
    int sockfd,new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int sin_size,iDataNum;
//    const char hello[]="Hello cpp, you are success.\n";
    char buffer[4096];

    if(argc!=2)
    {
         fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
         return 0;
    }
   // if((portnumber=atoi(argv[1]))<0)
   // {
     //    fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
//  return 0;
  //  }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
 return 0;
    }
    bzero(&server_addr,sizeof(struct sockaddr_in));
    server_addr.sin_family=AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port=htons(portnumber);
    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
 return 0;
    }
    if(listen(sockfd,5)==-1)
    {
        fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
 return 0;
    }
    while(1)
    {
        sin_size=sizeof(struct sockaddr_in);
 if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
 {
     fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
     return 0;
 }
 fprintf(stdout,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
 iDataNum=recv(new_fd,buffer,4096,0);
 if(iDataNum<0)
 { 
     perror("Recv\n");
     exit(1);
 }
 printf("Recv data is %s\n",buffer);
 send(new_fd,buffer,sizeof(buffer),0);
// if(write(new_fd,hello,strlen(hello))==-1)
// {
//      fprintf(stderr,"write error:%s\n",strerror(errno));
//      return 0;
// }
 close(new_fd);

    }
    close(sockfd);
   // exit(0);
    return 0;
}

client.c

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<errno.h>

int main(int argc,char *argv[])
{
    int sockfd;
    char sendbuffer[200];
    char recvbuffer[200];
  //  char buffer[1024];
    struct sockaddr_in server_addr;
    struct hostent *host;
    int portnumber,nbytes;
    if(argc!=3)
    {
 fprintf(stderr,"Usage :%s hostname portnumber\a\n",argv[0]);
 exit(1);
    }
    if((host=gethostbyname(argv[1]))==NULL)
    {
 herror("Get host name error\n");
 exit(1);
    }
    if((portnumber=atoi(argv[2]))<0)
    {
 fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
 exit(1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
 fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
 exit(1);
    }
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(portnumber);
    server_addr.sin_addr=*((struct in_addr *)host->h_addr);
    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
 fprintf(stderr,"Connect error:%s\n",strerror(errno));
 exit(1);
    }
    while(1)
    {
         printf("Please input your word:\n");
  scanf("%s",sendbuffer);
  printf("\n");
  if(strcmp(sendbuffer,"quit")==0)
     break;
  send(sockfd,sendbuffer,sizeof(sendbuffer),0);
  recv(sockfd,recvbuffer,200,0);
  printf("recv data of my world is :%s\n",recvbuffer);
    }
   // if((nbytes=read(sockfd,buffer,1024))==-1)
    //{
// fprintf(stderr,"read error:%s\n",strerror(errno));
// exit(1);
  //  }
   // buffer[nbytes]='\0';
   // printf("I have received %s\n",buffer);
    close(sockfd);
    exit(0);
}

首先要编译tcpserver.c,命令:gcc -g tcpserver.c -o tcpserver

 运行:./tcpserver 8080

 

然后再编译tcpclient.c,具体命令:gcc -g tcpclient.c -o tcpclient

运行:./tcpclient localhost 8080

 

 

 

posted @ 2013-09-04 13:58  星语160523  阅读(10722)  评论(0编辑  收藏  举报