socket服务器-客户端程序

端口字节序转换

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
//返回网络字节序的值
uint16_t htons(uint16_t hostshort);
//返回网络字节序的值
uint32_t ntohl(uint32_t netlong);
//返回主机字节序的值
uint16_t ntohs(uint16_t netshort);
//返回主机字节序的值

h代表host,n代表net,s代表short(两个字节),l代表long(四个字节),通过上面的四个函数,可以实现主机字节序和网络字节序之间的转换。有时可以用INADDR_ANY,INADDR_ANY指定地址让操作系统自己获取

服务器端:

gcc server.c -o server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

//      int socket(int domain, int type, int protocol);
//      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//      int listen(int sockfd, int backlog);
//      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//      uint16_t htons(uint16_t hostshort);  //转换端口号为网络字节序
//      int inet_aton(const char *cp, struct in_addr *inp);  //转换IP地址为网络字节序


int main()
{
        int s_fd;

        int n_read;
        char readBuf[128] = {0};
        char *msg = "I get Your message";

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        memset(&s_addr, 0, sizeof(struct sockaddr_in));
        memset(&c_addr, 0, sizeof(struct sockaddr_in));

        //1.socket

        s_fd = socket(AF_INET, SOCK_STREAM, 0);   //建立网络通信管道
        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }
        //2.bind

        s_addr.sin_family = AF_INET;    //配置TCP协议
        s_addr.sin_port = htons(8987);  //配置端口号,htnos()函数把字符串转为网络字节序列
        inet_aton("192.168.1.105", &s_addr.sin_addr);  //配置网络字节序的IP地址

        bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));  //把配置的信息绑定到socket网络通信通道上

        //3.listen

        listen(s_fd, 10);  //监听等待客户端连接

        //4.accept

        int clen = sizeof(struct sockaddr_in);

        int c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);   //连接客户端
        if(c_fd == -1){
                perror("accept");
        }
        printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));

        //5.read

        n_read = read(c_fd, readBuf,sizeof(readBuf));
        if(n_read == -1){
                perror("read");
        }else{
                printf("get message:%d, %s\n",n_read, readBuf);
        }

        //6.write

        write(c_fd, msg, strlen(msg));


        return 0;
}

客户端:

gcc client.c -o client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

//      int socket(int domain, int type, int protocol);
//      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//      int listen(int sockfd, int backlog);
//      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//      uint16_t htons(uint16_t hostshort);  //转换端口号为网络字节序
//      int inet_aton(const char *cp, struct in_addr *inp);  //转换IP地址为网络字节序


int main()
{
        int c_fd;
        int n_read;
        
        char readBuf[128] = {0};
        char *msg = "msg from client";

        struct sockaddr_in c_addr;
        memset(&c_addr, 0, sizeof(struct sockaddr_in));

        //1.socket

        c_fd = socket(AF_INET, SOCK_STREAM, 0);   //建立网络通信管道
        if(c_fd == -1){
                perror("socket");
                exit(-1);
        }

        c_addr.sin_family = AF_INET;    //配置TCP协议
        c_addr.sin_port = htons(8987);  //配置端口号,htnos()函数把字符串转为网络字节序列
        inet_aton("192.168.1.105", &c_addr.sin_addr);  //配置网络字节序的IP地址

        //2.connect

        if(connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)) == -1){
                perror("connect");
                exit(-1);
        }

        //3.send

        write(c_fd, msg, strlen(msg));

        //4.read

        n_read = read(c_fd, readBuf,sizeof(readBuf));
        if(n_read == -1){
                perror("read");
        }else{
                printf("get message from server:%d, %s\n",n_read, readBuf);
        }



        return 0;
}

这样服务器server和客户端client就可以完成一次的通信

持续通信:

服务器端:

gcc server.c -o server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

//      int socket(int domain, int type, int protocol);
//      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//      int listen(int sockfd, int backlog);
//      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//      uint16_t htons(uint16_t hostshort);  //转换端口号为网络字节序
//      int inet_aton(const char *cp, struct in_addr *inp);  //转换IP地址为网络字节序


int main(int argc, char **argv)
{
        int s_fd;
        int c_fd;

        int n_read;
        char readBuf[128] = {0};
//      char *msg = "I get Your message";
        char msg[128] = {0};

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        memset(&s_addr, 0, sizeof(struct sockaddr_in));
        memset(&c_addr, 0, sizeof(struct sockaddr_in));

        if(argc !=3){
                printf("param is not good\n");
                exit(-1);
        }        

		//1.socket

        s_fd = socket(AF_INET, SOCK_STREAM, 0);   //建立网络通信管道
        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }

        //2.bind

        s_addr.sin_family = AF_INET;    //配置TCP协议
        s_addr.sin_port = htons(atoi(argv[2]));  //配置端口号,htnos()函数把字符串转为网络字节序列
        inet_aton(argv[1], &s_addr.sin_addr);  //配置网络字节序的IP地址

        bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));  //把配置的信息绑定到socket网络通信通道上

        //3.listen

        listen(s_fd, 10);  //监听等待客户端连接

        //4.accept

        int clen = sizeof(struct sockaddr_in);
        while(1){
                c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);   //连接客户端
                if(c_fd == -1){
                        perror("accept");
                }
                printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));
                if(fork() == 0){

                        //5.read
                        if(fork() == 0){
                                while(1){
                                        memset(msg, 0, sizeof(msg));
                                        printf("input: ");
                                        gets(msg);
                                        write(c_fd, msg, strlen(msg));
                                }
                        }
                        while(1){
                                memset(readBuf, 0, sizeof(readBuf));
                                n_read = read(c_fd, readBuf,sizeof(readBuf));
                                if(n_read == -1){
                                        perror("read");
                                }else{
                                        printf("get message:%d, %s\n",n_read, readBuf);
                                }
                        }

                        //6.write

                        break;
                }

        }

        return 0;
}

客户端:

gcc client.c -o client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

//      int socket(int domain, int type, int protocol);
//      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//      int listen(int sockfd, int backlog);
//      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//      uint16_t htons(uint16_t hostshort);  //转换端口号为网络字节序
//      int inet_aton(const char *cp, struct in_addr *inp);  //转换IP地址为网络字节序


int main(int argc, char **argv)
{
        int c_fd;

        int n_read;
        char readBuf[128] = {0};
//      char *msg = "msg from client";
        char msg[128] = {0};

        struct sockaddr_in c_addr;
        memset(&c_addr, 0, sizeof(struct sockaddr_in));

        if(argc !=3){
                printf("param is not good\n");
                exit(-1);
        }

        //1.socket

        c_fd = socket(AF_INET, SOCK_STREAM, 0);   //建立网络通信管道
        if(c_fd == -1){
                perror("socket");
                exit(-1);
        }        

		c_addr.sin_family = AF_INET;    //配置TCP协议
        c_addr.sin_port = htons(atoi(argv[2]));  //配置端口号,htnos()函数把字符串转为网络字节序列
        inet_aton(argv[1], &c_addr.sin_addr);  //配置网络字节序的IP地址

        //2.connect

        if(connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)) == -1){
                perror("connect");
                exit(-1);
        }

        while(1){

                //3.send
                if(fork() == 0){
                        while(1){
                                memset(msg, 0, sizeof(msg));
                                printf("input: ");
                                gets(msg);
                                write(c_fd, msg, strlen(msg));
                        }
                }
                //4.read
                while(1){
                        memset(readBuf, 0, sizeof(readBuf));
                        n_read = read(c_fd, readBuf,sizeof(readBuf));
                        if(n_read == -1){
                                perror("read");
                        }else{
                                printf("get message from server:%d, %s\n",n_read, readBuf);
                        }
                }
        }



        return 0;
}

可以保持一直两机通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值