天天看點

linux中一個簡單的TCP套接字程式(2)

   該程式是一個雖然簡單但是完整的tcp用戶端/服務端執行個體。實作了本機客戶與本機伺服器的連接配接建立及互相發送消息。建立連接配接之後,用戶端接收并列印出伺服器發送來的資料。伺服器列印出用戶端的IP位址并向用戶端發送資料。

   伺服器程式srv.c如下:

#include<stdio.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define PORT    1234
#define BACKLOG 1

int main()
{
        int listenfd,connectfd;
        struct sockaddr_in server;
        struct sockaddr_in client;
        int sin_size;

        if((listenfd=(socket(AF_INET,SOCK_STREAM,0)))==-1)
        {
                //handle exception
                perror("Creating socket failed");
                exit(1);
        }

        bzero(&server,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_port=htons(PORT);
        server.sin_addr.s_addr=htonl(INADDR_ANY);

        /*Bind socket to address*/
        if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
        {
                perror("Bind error");
                exit(1);
        }

        /*Listen client's reqirement*/
        if(listen(listenfd,BACKLOG)==-1)
        {
                perror("listen failed");
                exit(1);
        }

        sin_size=sizeof(struct sockaddr_in);
        if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)
        {
                perror("accept() error");
                exit(1);
        }


        //prints client's IP
        printf("You got a connection from %s\n",inet_ntoa(client.sin_addr));
        send(connectfd,"Welcome to my server.\n",22,0);

        close(connectfd);
        close(listenfd);

}
           

   用戶端程式cli.c如下:

#include<stdio.h>
#include<unistd.h>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>

#define PORT 1234
#define MAXDATASIZE 100

int main(int argc,char *argv[])
{
        int fd,numbytes;
        char buf[MAXDATASIZE];
        struct hostent *he;

        struct sockaddr_in server;

        if(argc!=2)
        {
                printf("Usage:%s<IP Address>",argv[0]);
                exit(1);
        }
        if((he=gethostbyname(argv[1]))==NULL)
        {
                perror("gethostbyname() error\n");
                exit(1);
        }

        if((fd=(socket(AF_INET,SOCK_STREAM,0)))==-1)
        {
                printf("socket() error");
                exit(1);
        }

        bzero(&server,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_port=htons(PORT);
        server.sin_addr=*((struct in_addr*)he->h_addr);

        /*Connect to server and receive data from the server.*/

        if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
        {
                printf("connect() error\n");
                exit(1);
        }

        if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)
        {
                printf("recv() error");
                exit(1);
        }
        buf[numbytes]='\0';
        printf("Server Message: %s\n",buf);

        close(fd);
}

           

   編譯之後,首先啟動伺服器程式:

[[email protected] 20160910]# ./srv
           

   再啟動用戶端程式:

[[email protected] 20160910]# ./cli 127.0.0.1
           

   伺服器的運作結果:

[roo[email protected] 20160910]# ./srv
You got a connection from 127.0.0.1
           

   用戶端的運作結果:

[[email protected] 20160910]# ./cli 127.0.0.1
Server Message: Welcome to my server.
           

繼續閱讀