TCP服务器、客户端之间的相互通信

来源:互联网 发布:蜗居 知乎 编辑:程序博客网 时间:2024/05/22 03:18

TCP服务器、客户端之间的相互通信

之前的版本只能实现TCP服务器之间单发单收,此版本能实现TCP服务器和客户端之间的相互通信。

见下面的程序:

tcp_server.c

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <errno.h>#include <arpa/inet.h>#define PORT 3333int main(){    int sockfd;    int sock_fd;    struct sockaddr_in server_addr;    struct sockaddr_in client_addr;    int addrlen = sizeof(struct sockaddr);    int addrinlen = sizeof(struct sockaddr_in);    int recvbytes;    char buf[512];    char buf1[1024];    //服务器创建套接字    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)    {        fprintf(stderr, "socket error:%s\n", strerror(errno));exit(1);    }    //服务器填充sockaddr结构    bzero(&server_addr, addrinlen);    server_addr.sin_family = AF_INET;    //server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY表示可以接收任意IP地址的数据,即绑定所有的IP    server_addr.sin_addr.s_addr = inet_addr("192.168.1.222");//用于绑定到一个固定的IP,inet_addr用于把数字加格式的IP转化为整形IP    server_addr.sin_port = htons(PORT);    //绑定socket到IP地址    if(bind(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0)    {        fprintf(stderr, "bind error:%s\n", strerror(errno));exit(1);    }    //设置允许连接的最大客户端数目    if(listen(sockfd, 5) < 0)    {        fprintf(stderr, "listen error:%s\n", strerror(errno));exit(1);    }    while(1)    {        //建立连接if((sock_fd = accept(sockfd, (struct sockaddr *)&client_addr, &addrinlen)) < 0){            fprintf(stderr, "accept error:%s\n", strerror(errno));    exit(1);}if((recvbytes = recv(sock_fd, buf, 512, 0)) < 0){            fprintf(stderr, "recv error:%s\n", strerror(errno));    close(sockfd);    close(sock_fd);    exit(1); }        buf[recvbytes] = '\0';        printf("receive from client is %s", buf);sleep(1);printf("Please input:");fgets(buf1, 1024, stdin);if(send(sock_fd, buf1, 1024, 0) < 0){            fprintf(stderr, "send error:%s\n", strerror(errno));    close(sockfd);    close(sock_fd);    exit(1); }//通讯结束        close(sock_fd);    }    //关闭    close(sockfd);    return 0;}

tcp_client.c

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <errno.h>#include <arpa/inet.h>#define PORT 3333int main(){    int sockfd;    struct sockaddr_in server_addr;    int addrlen = sizeof(struct sockaddr);    int addrinlen = sizeof(struct sockaddr_in);    char buf[512];    char buf1[1024];    //客户端程序创建套接字    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)    {        fprintf(stderr, "socket error:%s\n", strerror(errno));exit(1);    }    //客户端程序填充服务器的资料    bzero(&server_addr, addrlen);//初始化,置0    server_addr.sin_family = AF_INET;//IPv4    //server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//    server_addr.sin_addr.s_addr = inet_addr("192.168.1.222");    server_addr.sin_port = htons(PORT);//将本机的short数据转化为网络上的short数据——端口号        //服务器发起连接请求    if(connect(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0)    {        fprintf(stderr, "bind error:%s\n", strerror(errno));exit(1);    }        while(1)    {    //连接成功    printf("Please input:");    fgets(buf, 512, stdin);        //发送数据    if(send(sockfd, buf, 512, 0) < 0)    {        fprintf(stderr, "send error:%s\n", strerror(errno));close(sockfd);exit(1);    }    //write(sockfd, buf, strlen(buf));    memset(buf1, 0, sizeof(buf1));    if(read(sockfd, buf1, sizeof(buf1)) < 0)    {        fprintf(stderr, "listen error:%s\n", strerror(errno));close(sockfd);exit(1);    }    printf("receice from server is %s", buf1);    close(sockfd);    }        //关闭套接字    close(sockfd);    return 0;}

运行结果:



0 0
原创粉丝点击