初识网络编程

 

客户端

#include <head.h> 

int flag=1;
 
//客户端接收线程
void * client_recv(void* arg)
{
    int client=*(int*)arg;
    while(1)
    {      
        char arr[128];
        memset(arr,0,128);
        int res=read(client,arr,127);  //将读取到的数据存放在首地址偏移4个字节的位置处
        if(res==0)
        {
            printf("\n服务端断开连接~\n");
            flag=0;
            break;
        }
        printf("\n接收到对方发来的内容:%s\n",arr);
        printf("请输入聊天内容:");
        fflush(stdout); 
    }
    pthread_exit(NULL);
}
 
//客户端发送线程
void* client_send(void* arg)
{
    int client=*(int*)arg;
    while(1)
    {
 
        //客户端发送
        char msg[128]="";
 
        printf("请输入聊天内容:");
        scanf("%s",msg);
        getchar();
        msg[strcspn(msg, "\n")] = '\0';
if(flag==0)
{close(client);
    break;
}
        if(-1==write(client,msg,strlen(msg)))
        {
            return NULL;
        }
    }
    pthread_exit(NULL);
} 
int main(int argc, const char *argv[])
{
    if(argc<2)
    {
        printf("请输入端口号!\n");
        return 1;
    }
    short port=atoi(argv[1]);
    int client=socket(AF_INET,SOCK_STREAM,0);
 
    struct sockaddr_in addr={0};
    addr.sin_family=AF_INET;
 
    addr.sin_port=htons(port); //端口写服务器写的端口号
    addr.sin_addr.s_addr=inet_addr("127.0.0.1"); 
 
    int a=connect(client,(struct sockaddr*)&addr,sizeof(addr));
    if(a==-1)
    {
        printf("连接失败\n");
        return 0;
    }
    printf("链接成功\n");
 
    pthread_t p2;
    if(0!=(errno=pthread_create(&p2,NULL,client_recv,&client)))
    {
        ERRLOG("pthread_create error");
    }
 
    pthread_t p1;
    if(0!=(errno=pthread_create(&p1,NULL,client_send,&client)))
    {
        ERRLOG("pthread_create error");
    }
                             
    pthread_join(p1,NULL);     
    pthread_join(p2,NULL);     
    close(client);    
    return 0;
}

服务端

#include <head.h>
 
void* server_send(void* arg)
{
    int client=*(int*)arg;
    //服务端发送
    while(1)
    {
        char msg[128]="";
        printf("请输入聊天内容:");
        scanf("%s",msg);
        getchar();
        msg[strcspn(msg, "\n")] = '\0';
 
        write(client,msg,strlen(msg)); 
    }
    pthread_exit(NULL);
}
 
//服务端接收函数
void *server_recv(void* arg)
{
    int client=*(int*)arg;                                                                 
    while(1)                                                                               
    {                                                                                      
 
        char arr[128];                                                                     
        memset(arr,0,128);                                                                      
        int res=read(client,arr,127);  //将读取到的数据存放在首地址偏移4个字节的位置处     
        if(res==0)                                                                         
        {                                                                                  
            printf("\n客户端断开连接~\n");                                                   
            return;                                                                         
        }                                                                                  
        printf("\n接收到对方发来的内容:%s\n",arr);
        printf("请输入聊天内容:");
        fflush(stdout);
    }                                                                                      
    pthread_exit(NULL);                                                                    
}
int main(int argc, const char *argv[])
{
    if(argc<2)
    {
        printf("请输入端口号!\n");
        return 1;
    }
    short port=atoi(argv[1]);
 
    //创建服务器套接字
    int server=socket(AF_INET,SOCK_STREAM,0);
 
    //准备好要写入的套接字信息结构体,初始化信息
    struct sockaddr_in addr={0};
    //设置地址族为ipv4
    addr.sin_family=AF_INET;
    //设置监听端口号
    addr.sin_port=htons(port);
    //设定接收的ip地址,0为接收所有
    addr.sin_addr.s_addr=inet_addr("0.0.0.0");
 
    //将结构体信息(ip和port)写入套接字中
    if(bind(server,(struct sockaddr*)&addr,sizeof(addr))==-1)
    {
        perror("bind error..");
        return -1;
    }
    //监听
    listen(server,10);
 
    //接收
    //准备好客户端结构体
    struct sockaddr_in client_addr;
    int client_len = sizeof(client_addr);
    //接收客户端,返回客户端套接字
    int client = accept(server,(struct sockaddr*)&client_addr,&client_len);
    if(client==-1)
    {
        ERRLOG("客户端接受失败");
    }
    printf("有客户端连接成功!\n");
 
    pthread_t p2;
    if(0!=(errno=pthread_create(&p2,NULL,server_send,&client)))
    {
        ERRLOG("pthread_create error");
    }
    pthread_t p1;                                                         
    if(0!=(errno=pthread_create(&p1,NULL,server_recv,&client)))               
    {                                                                    
        ERRLOG("pthread_create error");                                  
    }                                                                    
 
    pthread_join(p1,NULL);
    pthread_join(p2,NULL);    close(client);
    close(server);
    return 0;
}

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值