zoukankan      html  css  js  c++  java
  • 网络通信TCP编程实例代码

    Makefile:

    all:
    	gcc -o server server.c -lpthread
    	gcc -o client client.c
    
    clean:
    	rm server client
    

    server.c:

    /*TCP:
      server.c
    */
    
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <pthread.h>
    
    void *do_work(void *arg);
    
    int main(int argc,char *argv[])
    {
        int sockfd;
        int ret;
    
        /*1.调用socket建立网络套接字*/
        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(-1 == sockfd){
            perror("socket server");
            return -1;
        }
    
        /*2.填充服务器地址和端口号*/
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(servaddr));
        servaddr.sin_family = AF_INET;        //协议族
        servaddr.sin_port = htons(6775);    //端口号5001-65536
        servaddr.sin_addr.s_addr = inet_addr("192.168.7.223"); //ip地址
        socklen_t alen = sizeof(servaddr);
    
        /*3.调用bind绑定服务器地址和端口*/
        ret = bind(sockfd,(struct sockaddr *)&servaddr,alen);    
        if(-1 == ret){
            perror("bind");
            return -1;
        }
    
        /*4.调用listen主动监听是否有客户连接*/
        ret = listen(sockfd,10);
        if(-1 == ret){
            perror("listen");
            return -1;
        }
        printf("servet init.d success...
    ");
    
        int newfd = -1;     //新的套接字描述符
        char buf[1024] = {0};
        pthread_t tid;        //新建线程ID
    
        while(1)
        {
            /*5.调用accept接受客户端连接*/
            newfd = accept(sockfd,NULL,NULL);
            if(newfd <= 0){
                continue;
            }
            printf("==>%d connect success..
    ",newfd);
    
            /*为每个客户开辟一个线程去管理*/
            ret = pthread_create(&tid,NULL,do_work,&newfd);
            if(0 != ret){
                perror("pthread_create failed
    ");
                break;
            }
            pthread_detach(tid);//设置为分离态,资源由系统自动回收
    
        }
    
        /*7.关闭打开的网络套接字***/
        close(sockfd);
        close(newfd);
    
        return 0;
    }
    
    /*线程执行函数*/
    void *do_work(void *arg)
    {
        int newfd = *(int *)arg;
        int ret;
        char buf[1024];
    
        /*6.调用read/write读写网络文件*/
        while(1)
        {
            memset(buf,0,sizeof(buf));
            ret = read(newfd,buf,sizeof(buf)-1);    
            if(ret > 0){
                printf("recv data:%s
    ",buf);
            }
        }
    
        pthread_exit(NULL);
    }

    client.c:

    /*TCP:
      client.c
    */
    
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc,char *argv[])
    {
        int sockfd;
        int ret;
        char buf[1024] = {0};
    
        /*1.调用socket建立网络套接字*/
        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(-1 == sockfd){
            perror("socket server");
            return -1;
        }
    
        /*2.填充服务器地址和端口号*/
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(servaddr));
        servaddr.sin_family = AF_INET;        //协议族
        servaddr.sin_port = htons(6775);    //端口号5001-65536
        servaddr.sin_addr.s_addr = inet_addr("192.168.7.223"); //ip地址
        socklen_t alen = sizeof(servaddr);
    
        /*3.调用connect连接服务器(根据ip地址和端口去连接)*/
        ret = connect(sockfd,(struct sockaddr *)&servaddr,alen);
        if(-1 == ret){
            perror("connect");
            return -1;
        }
        printf("client connect success...
    ");
    
        /*4.调用read/write读写网络文件*/
        while(1)
        {
            /*从终端获取信息*/
            memset(buf,0,sizeof(buf));
            ret = read(0,buf,sizeof(buf)-1);    
            if(ret > 0){
                
                /*发送给服务器*/
                write(sockfd,buf,ret);
            }
        }
    
        /*7.关闭打开的网络套接字***/
        close(sockfd);
    
        return 0;
    }
  • 相关阅读:
    浅谈Linux文件操作
    数据结构学习--队列
    CODE[VS] 1099 字串变换
    CODE[VS] 1026 逃跑的拉尔夫
    CODE[VS] 3027 线段覆盖 2
    LeetCode8.字符串转换整数(atoi) JavaScript
    JS实现继承 JavaScript
    LeetCode7.整数反转 JavaScript
    LeetCode6.Z字形变换 JavaScript
    LeetCode5.最长回文子串 JavaScript
  • 原文地址:https://www.cnblogs.com/yihujiu/p/5520939.html
Copyright © 2011-2022 走看看