Linux C编程(八) 之 网络编程(下)

这里运用前两篇的内容做出以下实例代码
server:

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include <arpa/inet.h>
#include<pthread.h>

/*打印代码运行方式*/
static void usage(const char *proc)
{
    printf("Please use :%s [IP] [port]\n",proc);
}

void thread_run(void *arg)
{
    printf("creat a new thread\n");
    int fd = (int)arg;
    char buf[1024];

    while(1){
        memset(buf,'\0',sizeof(buf));
        ssize_t _s = read(fd,buf,sizeof(buf) - 1);
        if(_s > 0){
            buf[_s] = '\0';
            printf("client say : %s\n",buf);
        }    
        memset(buf,'\0',sizeof(buf));
        printf("please Enter: ");
        fflush(stdout);
        ssize_t _s2 = read(0,buf,sizeof(buf) - 1);
        if(_s2 > 0){
            write(fd,buf,strlen(buf));
        }
    }
}

int main(int argc,char *argv[])
{
/*参数判断*/
    if(argc != 3){
        usage(argv[0]);
        exit(1);
    }

    //1.创建socket
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("creat socket error\n");
        return 1;
    }
	/*分配设置地址对象*/
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr = inet_addr(argv[1]);

    //将socket和地址绑定

    if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
        perror("bind error\n");
        close(sock);
        return 2;
    }
   
    //开启对socket的监听
    if(listen(sock,10) < 0){
        perror("listen error\n");
        close(sock);
        return 3;
    }
    printf("bind and listen success!wait accept...\n");
    
    //4.从监听队列里阻塞获取连接socket
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);
    while(1){
        int fd = accept(sock,(struct sockaddr*)&peer ,&len);
        if(fd < 0){
            perror("accept error\n");
            close(sock);
            return 4;
        }
        
        printf("get connect,ip is : %s port is : %d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
		
		/*开启一个线程做业务处理(后续会详细讲解线程相关内容) 此处可理解为将参数fd传递到thread_run函数 并执行该函数*/
        pthread_t id;
        pthread_create(&id,NULL,thread_run,(void*)fd);

        pthread_detach(id);

    }
    close(sock);
    return 0;
}

client:

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>

static void usage(const char *proc)
{
    printf("please use : %s [ip] [port]\n",proc);
}
int main(int argc,char *argv[])
{
    if( argc != 3 ){
        usage(argv[0]);
        exit(1);
    }
    
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("socket error");
        return 1;
    }

    struct sockaddr_in remote;
    remote.sin_family = AF_INET;
    remote.sin_port = htons(atoi(argv[2]));
    remote.sin_addr.s_addr = inet_addr(argv[1]);

	/*向服务器发起连接*/
    int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));
    if(ret < 0){
        printf("connect failed:%s\n",strerror(errno));
        return 2;
    }

    printf("connect success!\n");
    
    char buf[1024];
    while(1){
        memset(buf,'\0',sizeof(buf));
        printf("please enter:");
        fflush(stdout);
        ssize_t _s = read(0,buf,sizeof(buf)-1);
        if(_s > 0){
            buf[_s - 1] = '\0';
            write(sock,buf,strlen(buf));
            _s = read(sock,buf,sizeof(buf)-1);
            if(_s > 0){
                if(strncasecmp(buf,"quit",4) == 0){
                     printf("qiut\n");
                     break;
                 }
                buf[_s -1] = '\0';
                printf("%s\n",buf);
            }
        }
    }
    close(sock);
    return 0;
}

运行效果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值