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);
}


   编译之后,首先启动服务器程序:

[root@mylinux 20160910]# ./srv


   再启动客户端程序:

[root@mylinux 20160910]# ./cli 127.0.0.1

  

   服务器的运行结果:

[root@mylinux 20160910]# ./srv
You got a connection from 127.0.0.1

   客户端的运行结果:

[root@mylinux 20160910]# ./cli 127.0.0.1
Server Message: Welcome to my server.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值