Go最新基于套接字SOCKET的及时聊天_基于套接字的(1),干货分享

10 篇文章 0 订阅
10 篇文章 0 订阅

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

        {
            memset(buf,0,sizeof(buf));
            ret=read(0,buf,sizeof(buf));
            //printf("read %d character\n",ret);
            if(ret>0)
            {
                ret=send(sfd,buf,strlen(buf)-1,0);
                //printf("have send %d messages!\n",ret);
            }
            else{
                printf("byebye!\n");
            }
        }
        if(FD_ISSET(sfd,&rdset))
        {
            memset(buf,0,sizeof(buf));
            ret=recv(sfd,buf,sizeof(buf),0);
            if(ret>0)
            {
                printf("%s\n",buf);    
            }
        }
    }
}
close(sfd);
return 0;

}


## 二、基于udp通信以及select多路转接模型的即时聊天


###  1、基于udp的网络编程简介示意图


### 


### 2、基于udp和select接口的及时聊天


####        头文件及部分数据结构,同上所示


#### 



服务器端:

#include"func.h"

int main(int argc,char **argv)
{
if(3!=argc)
{
printf(“error argcs!\n”);
return 0;
}
int ret,sfd;
sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd==-1)
{
perror(“socket”);
return -1;
}
struct sockaddr_in ser;
memset(&ser,0,sizeof(ser));
ser.sin_family=AF_INET;
ser.sin_port=htons(atoi(argv[2]));
ser.sin_addr.s_addr=inet_addr(argv[1]);
ret=bind(sfd,(struct sockaddr *)&ser,sizeof(ser));//udp绑定后监听就打开了
if(-1ret)
{
perror(“bind”);
return -1;
}
fd_set rdset;
char buf[128]={0};
struct sockaddr_in cli;
memset(&cli,0,sizeof(cli));
int cli_len=sizeof(cli);
static int flag=0,flag2=0;
while(1)
{
FD_ZERO(&rdset);
FD_SET(0,&rdset);
FD_SET(sfd,&rdset);
ret=select(sfd+1,&rdset,NULL,NULL,NULL);
if(ret>0)
{
if(FD_ISSET(sfd,&rdset))
{
flag2=1;
memset(buf,0,sizeof(buf));
ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cli,&cli_len);
flag=1;
if(ret>0)
{
printf(“Client:%s”,buf);
}
else{
printf(“byebye!\n”);
close(sfd);
break;
}
}
if(FD_ISSET(0,&rdset)&&flag
1)
{
memset(buf,0,sizeof(buf));
ret=read(0,buf,sizeof(buf));
if(ret>0)
{
ret=sendto(sfd,buf,strlen(buf)-1,0,(struct sockaddr *)&cli,cli_len);
//printf(“have sendto %d characters!\n”,ret);
}
else{
printf(“byebye!\n”);
close(sfd);
break;
}
}else{
if(flag2==0)
puts(“please connect server first!then try again:”);
flag2=1;
}

    }
}

}


#### 



客户端:

#include"func.h"

int main(int argc,char **argv)
{
if(3!=argc)
{
printf(“errror argcs!\n”);
return -1;
}
int sfd,ret;
sfd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==sfd)
{
perror(“socket”);
return -1;
}
struct sockaddr_in ser;
memset(&ser,0,sizeof(ser));
struct sockaddr_in cli;
memset(&cli,0,sizeof(cli));
int clilen=sizeof(cli);
ser.sin_family=AF_INET;
ser.sin_port=htons(atoi(argv[2]));
ser.sin_addr.s_addr=inet_addr(argv[1]);
fd_set rdset;
char buf[128]={0};
while(1)
{
FD_ZERO(&rdset);
FD_SET(0,&rdset);
FD_SET(sfd,&rdset);
ret=select(sfd+1,&rdset,NULL,NULL,NULL);
if(ret>0)
{
if(FD_ISSET(0,&rdset))
{
memset(buf,0,sizeof(buf));
ret=read(0,buf,sizeof(buf));
if(ret>0)
{
ret=sendto(sfd,buf,sizeof(buf),0,(struct sockaddr *)&ser,clilen);
}else{
printf(“byebye!\n”);
close(sfd);
break;
}
}
if(FD_ISSET(sfd,&rdset))
{
memset(buf,0,sizeof(buf));
ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cli,&clilen);
//printf(“recv %d characters!\n”,ret);
//puts(buf);
if(ret>0)
{
puts(buf);
}else{
printf(“byebye!\n”);
close(sfd);
break;
}
}
}

}

}


## 三、基于epoll多路复用的tcp简洁版及时聊天


### 1、 头文件


#### 




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




### 2、服务器端



#include"func.h"
//传递两个参数,一个IP地址,一个端口号
int main(int argc,char *argv[])
{
if(3!=argc)
{
printf(“error argcs!\n”);
return -1;
}
int sfd; //ADDRESS FAMILY–> AF
sfd=socket(AF_INET,SOCK_STREAM,0); //就有点类似于打开文件描述符
if(-1sfd)
{
perror(“socket”);
return -1;
}
struct sockaddr_in ser;
ser.sin_family=AF_INET;
ser.sin_port=htons(atoi(argv[2]));
ser.sin_addr.s_addr=inet_addr(argv[1]);
int ret,ret1;
ret=bind(sfd,(struct sockaddr *)&ser,sizeof(ser));
if(-1
ret)
{
perror(“bind”);
return -1;
}
listen(sfd,10); //打开监听
int newfd=-1; //用accept去接受客户端的信息
struct sockaddr_in cli;
int len=sizeof(cli);
char buf[128]={0};
int epfd=epoll_create(1);
struct epoll_event event,evs[3];
memset(&event,0,sizeof(event)); //注册标准输入
event.data.fd=STDIN_FILENO;
event.events=EPOLLIN;
ret=epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&event);
if(-1ret)
{
perror(“epoll_ctl”);
return -1;
}
event.data.fd=sfd;
event.events=EPOLLIN;
ret=epoll_ctl(epfd,EPOLL_CTL_ADD,sfd,&event);
if(-1
ret)
{
perror(“epoll_ctl”);
return -1;
}
//static int flag=0;
int i;
while(1)
{
memset(evs,0,sizeof(evs));
ret1=epoll_wait(epfd,evs,3,-1); //-1是永久等待
for(i=0;i<ret1;i++)
{
if(evs[i].data.fdnewfd)
{
memset(buf,0,sizeof(buf));
ret=recv(newfd,buf,sizeof(buf),0);
//printf(“recv %d messages!\n”,ret);
if(ret>0)
{
printf(“%s\n”,buf);
}
else if(0
ret){
printf(“byebye!\n”);
close(newfd);
event.data.fd=newfd;
event.events=EPOLLIN;
epoll_ctl(epfd,EPOLL_CTL_DEL,newfd,&event);
//newfd=-1;
//printf(“one -1\n”);
}
}
if(evs[i].data.fdsfd)
{
printf(“sfd dengle~~\n”);
memset(buf,0,sizeof(buf));
newfd=accept(sfd,(struct sockaddr *)&cli,&len);
printf(“newfd is %d\n”,newfd);
printf(“the client port is %d,it’s ip %s\n”,ntohs(cli.sin_port),inet_ntoa(cli.sin_addr));
//if(flag>0)
//{
// printf(“I am back!hony\n”);
//}
if(newfd
-1)
{
perror(“accept”);
return -1;
}
event.data.fd=newfd;
event.events=EPOLLIN;
ret=epoll_ctl(epfd,EPOLL_CTL_ADD,newfd,&event);
if(-1ret)
{
perror(“epoll_ctl”);
return -1;
}
//flag++;
}
if(evs[i].data.fd
0)
{
memset(buf,0,sizeof(buf));
ret=read(0,buf,sizeof(buf));
if(ret>0)
{
ret=send(newfd,buf,strlen(buf)-1,0);
//printf(“%s\n”,buf);
}
//printf(“byebye!\n”);
}
}
}
close(sfd);
close(newfd);
return 0;
}





### `3、客户端:`


#### 



![img](https://img-blog.csdnimg.cn/img_convert/6e35f8040ecb68611cb6495b8221c314.png)
![img](https://img-blog.csdnimg.cn/img_convert/0b599e2f7c7f029859e8f5ea90b83a81.png)
![img](https://img-blog.csdnimg.cn/img_convert/7c98d1873cfce78da04c5b2d1ae7778a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

rn 0;
}




3、客户端:

[外链图片转存中…(img-yKoqnmhz-1715894427599)]
[外链图片转存中…(img-Ip1MtAKV-1715894427599)]
[外链图片转存中…(img-orgprBnd-1715894427599)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值