一个简单的TCP套接字编程实例

来源:互联网 发布:样本册软件 编辑:程序博客网 时间:2024/04/29 06:19

采用一个服务器程序对应一个客户的方法,服务器不需要采取任何并发技术,执行TCP套接字服务端的基本过程是创建套接字,绑定套接字,监听,接收请求,读/写数据和终止连接。


服务器源程序:


  1. #include <stdio.h>

    #include <string.h>

    #include <unistd.h>

    #include <sys/socket.h>

    #include <sys/types.h>

    #include <netinet/in.h>

    #include <arpa/inet.h>

    #include <cstdio>

    #include <cstdlib>

    #define PORT 1234   //端口号

    #define BACKLOG 1   //所允许的连接数量

    int main()

    {

        int socketfd,connectfd;  //描述符

        struct sockaddr_in server; //服务器地址

        struct sockaddr_in client; //客户地址

        

        if((socketfd=socket(AF_INET,SOCK_STREAM, 0))==-1//产生tcp套接字

        {

            perror("socket  failed\n");

            exit(1);

        }

        int opt=SO_REUSEADDR//允许本地地址被重用

        setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

        bzero(&server, sizeof(server)); //初始化

        server.sin_family=AF_INET;     //tcp套接字

        server.sin_port=htons(PORT);   //将端口转换为网络字序

        server.sin_addr.s_addr=htonl(INADDR_ANY);  //内核选择ip

        if(bind(socketfd, (structsockaddr *)&server,sizeof(server))==-1//将套接字绑定到指定的协议地址

        {

            perror("Bind error\n");

            exit(1);

        }

        if(listen(socketfd,BACKLOG)==-1//监听 (如果没有请求,则被阻塞,进入休眠状态)

        {

            perror("listen error\n");

            exit(1);

        }

        socklen_t sin_size=sizeof(structsockaddr_in);

        

        if ((connectfd=accept(socketfd, (structsockaddr *)&client,&sin_size))==-1//接收请求

        {

            perror("accept error\n");

            exit(1);

        }

        printf("you got a connection form %s\n",inet_ntoa(client.sin_addr));

        send(connectfd, "hello\n", 6, 0); //发送信息

        close(connectfd);

        close(socketfd);

        return 0;

    }





客户端TCP套接字的基本过程:创建套接字,与服务器程序连接,读/写数据和终止连接。

客户端程序:


  1.  
  2. #include <stdio.h>

    #include <string.h>

    #include <unistd.h>

    #include <sys/socket.h>

    #include <sys/types.h>

    #include <netinet/in.h>

    #include <arpa/inet.h>

    #include <netdb.h>

    #include <cstdlib>

    #define PORT 1234 //定义端口号

    #define MAXDATASIZE 100  //定义缓冲区的大小

    int main()

    {

        int socketfd,numberbytes;   //文件描述符

        char buf[MAXDATASIZE];     //缓冲区,用来存储接收到的文本

        struct hostent *host;      //该结构体用来获取本地路由的信息

        struct sockaddr_in server; //服务器端地址信息

        if ((host=gethostbyname("127.0.0.1"))==NULL)

        {

            printf("gethostbyname error\n");

            exit(1);

        }

        if ((socketfd=socket(AF_INET,SOCK_STREAM, 0))==-1)

        {

            printf("socket error\n");

            exit(1);

        }

        bzero(&server, sizeof(server));

        server.sin_family=AF_INET;     //tcp套接字类型

        server.sin_port=htons(PORT);   //将端口转换成网络字序

        server.sin_addr=*((in_addr *)host->h_addr); //服务器地址

        if (connect(socketfd, (structsockaddr*)&server, sizeof(struct sockaddr))==-1)   //建立连接

        {

            perror("connect error\n");

            exit(1);

        }

        if((numberbytes=recv(socketfd, buf,100, 0))==-1//获取消息

        {

            printf("recv error\n");

            exit(1);

        }

        buf[numberbytes]='\0';

        printf("server message:%s\n",buf);

        close(socketfd);   //关闭连接

        return 0;

    }



先运行服务器端,在运行客服端即可。





0 0