基于linux的socket实现简易QQ代码

网络编程示例,写一个简单的QQ程序

服务器端

#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdio.h>
#include<time.h>
#define port 8888
char* getDateTime();
int main()
{
    //定义服务器 客户端的套接字描述符
    int sfd=0,cfd=0,ret=0,addrlen=0,count=0;

    char * nowtime;
    //定义接收缓存区
    unsigned char ReadBuffer[1024];
    unsigned char SendBuffer[1024];
    //定义服务器 客户端的套接字数据结构
    struct sockaddr_in saddr,caddr;

    //数据结构清0
    memset(&saddr,0,sizeof(struct sockaddr));
    memset(&caddr,0,sizeof(struct sockaddr));

    //创建服务器套接字
    sfd=socket(AF_INET,SOCK_STREAM,0);

    //判断
    if(sfd == -1)
    {
        perror("socket");
        exit(-1);
    }

    //初始化服务器套接字数据结构
    saddr.sin_family = AF_INET;
    saddr.sin_port  = htons(port);
    saddr.sin_addr.s_addr = INADDR_ANY;
    bzero(saddr.sin_zero,8);
    //套接字绑定
    ret = bind(sfd,(struct sockaddr*)(&saddr),sizeof(struct sockaddr));
    if(ret == -1)
    {
        perror("bind");
        exit(-1);
    }

    //监听设置
    ret=listen(sfd,10);
    if(ret == -1)
    {
        perror("listen");
        exit(-1);
    }
    while(1)
    {
        //接收等待
        addrlen = sizeof(struct sockaddr);
        cfd=accept(sfd,(struct sockaddr*)(&caddr),&addrlen);
        if(cfd == -1)
        {
            perror("accept");
        }
        printf("从机ip是%s\n",inet_ntoa(caddr.sin_addr));
        if(fork()==0)
        {
            while(1)
            {
                if(fork()==0)
                {
                    fgets(SendBuffer,1024,stdin);
                    send(cfd,SendBuffer,1024,0);
                    printf("\n");
                }
               nowtime=getDateTime();
               count= recv(cfd,ReadBuffer,1024,0);
               //printf("count is %d\n",count);
               ReadBuffer[count]='\0';
               printf("李京京 %s\n",nowtime);
               printf("%s\n",ReadBuffer);
            }
        }
    }

}


char* getDateTime()
{
    static char nowtime[20];
    time_t rawtime;
    struct tm* ltime;
    time(&rawtime);
    ltime=localtime(&rawtime);
    strftime(nowtime,20,"%Y-%m-%d %H:%M:%S",ltime);
    return nowtime;
}

客户端

#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdio.h>
#include<time.h>
#define port 8888
char* getDateTime();
int main(int argc,char **argv)
{
    //定义服务器 客户端的套接字描述符
    int cfd=0,ret=0;

    char * nowtime;
    //定义接收缓存区
    unsigned char SendBuffer[1024];
    unsigned char ReadBuffer[1024];
    //定义服务器 客户端的套接字数据结构
    struct sockaddr_in saddr,caddr;

    //数据结构清0
    memset(&saddr,0,sizeof(struct sockaddr));
    memset(&caddr,0,sizeof(struct sockaddr));

    //创建服务器套接字
    cfd=socket(AF_INET,SOCK_STREAM,0);

    //判断
    if(cfd == -1)
    {
        perror("socket");
        exit(-1);
    }

    //初始化服务器套接字数据结构
    caddr.sin_family = AF_INET;
    caddr.sin_port  = htons(port);
    inet_aton(argv[1],&caddr.sin_addr);
    bzero(caddr.sin_zero,8);
    ret = connect(cfd,(struct sockaddr*)(&caddr),sizeof(struct sockaddr));
    if(ret == -1)
    {
        perror("ret");
        exit(-1);
    }
    while(1)
    {
        if(fork()==0)
        {
            nowtime=getDateTime();
            ret=recv(cfd,ReadBuffer,1024,0);
            printf("张超 %s\n",nowtime);
            ReadBuffer[ret]='\0';
            printf("%s\n",ReadBuffer);
        }
        fgets(SendBuffer,1024,stdin);
        send(cfd,SendBuffer,1024,0);
        printf("\n");
    }
}

char* getDateTime()
{
    static char nowtime[20];
    time_t rawtime;
    struct tm* ltime;
    time(&rawtime);
    ltime=localtime(&rawtime);
    strftime(nowtime,20,"%Y-%m-%d %H:%M:%S",ltime);
    return nowtime;
}

代码执行效果

客户机端操作

root@DESKTOP-FR31BP0:/mnt/e/mycode/socket/mytcp# ./myclient 192.168.1.2
你好

哈哈哈

张超 2018-08-23 08:47:49
nihao

张超 2018-08-23 08:47:43
hahaha

服务器端操作

root@DESKTOP-FR31BP0:/mnt/e/mycode/socket/mytcp# ./myserver
从机ip是192.168.1.2
李京京 2018-08-23 08:47:38
你好

李京京 2018-08-23 08:47:43
哈哈哈

nihao

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值