socket实现在本机上的网络通信

客户端可以输入数据

#include<iostream>
using namespace std;
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<arpa/inet.h>

//tcp通信客户端
int main(){
        int sfd=socket(AF_INET,SOCK_STREAM,0);
        sockaddr_in saddr;
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(7000);  
        inet_pton(AF_INET,"192.168.232.132",&saddr.sin_addr.s_addr);
        int ret=connect(sfd,(sockaddr*)&saddr,sizeof(saddr));
        if(ret==-1){
                perror("connect");
                exit(0);
        }
        char str[1024];
        while(1){
            cin>>str;
            write(sfd,str,sizeof(str));
        }
        
}

服务器端读取数据

#include<iostream>
using namespace std;
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>

//tcp通信服务端
int main(){
        int sfd=socket(AF_INET,SOCK_STREAM,0);
        sockaddr_in saddr;
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(7000);  //绑定端口号7000
        inet_pton(AF_INET,"192.168.232.132",&saddr.sin_addr.s_addr);
        bind(sfd,(sockaddr*)(&saddr),sizeof(saddr));
        listen(sfd,5);
        sockaddr_in aaddr;
        socklen_t len=sizeof(aaddr);
        int cfd=accept(sfd,(sockaddr*)&aaddr,&len);
        if(cfd == -1) {
        perror("accept");
        exit(-1);
        }
         char clientIP[16];
        inet_ntop(AF_INET, &aaddr.sin_addr.s_addr,clientIP, sizeof(clientIP));
        cout<<"连接成功,客户端端口号为"<<ntohs(aaddr.sin_port)<<"ip为:"<<
        clientIP<<endl;
        char str[1024];
        while(1){
            read(cfd,str,sizeof(str));
            cout<<str<<endl;
        }
}

使用select改进服务器端实现多客户端进行通信

#include<iostream>
using namespace std;
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include <sys/select.h>

//tcp通信服务端
int main(){
        int sfd=socket(AF_INET,SOCK_STREAM,0);
        sockaddr_in saddr;
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(6500);  //绑定端口号6500
        saddr.sin_addr.s_addr=INADDR_ANY;
        bind(sfd,(sockaddr*)(&saddr),sizeof(saddr));
        listen(sfd,5);
        fd_set rdset,tempset;
        int maxfd=sfd;
        FD_ZERO(&rdset);
        FD_SET(sfd,&rdset);
        while(1){
            tempset=rdset; //为什么需要使用tempset,因为需要rdset保存的是所有通信过的socket fd
            int res=select(maxfd+1,&tempset,NULL,NULL,NULL);
            if(res>0&&FD_ISSET(sfd, &tempset)){
                sockaddr_in aaddr;
                socklen_t len=sizeof(aaddr);
                int cfd=accept(sfd,(sockaddr*)&aaddr,&len);
                char clientIP[16];
                inet_ntop(AF_INET, &aaddr.sin_addr.s_addr,clientIP, sizeof(clientIP));
                cout<<"连接成功,客户端端口号为"<<ntohs(aaddr.sin_port)<<"ip为:"<<
                clientIP<<endl;
                if(cfd>maxfd)
                    maxfd=cfd;
                FD_SET(cfd,&rdset);
                if(cfd == -1) {
                    perror("accept");
                    exit(-1);
                }
            }
                 
            for(int i=sfd+1;i<=maxfd;i++){
                if(FD_ISSET(i, &tempset)){
                    char str[1024];
                    int len=read(i,str,sizeof(str));
                    if(len==0){
                        close(i);
                        FD_CLR(i,&rdset); 
                    }
                    cout<<str<<endl;
                }
                   
            }
        }
     
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值