linux下建立服务器与客户端

        在此主要记录一下现在所学习Linux网络编程的内容,主要包括Linux下网络编程建立客户端与服务器:

        首先,建立服务器,主要分为4步:

        第一步:打开socket文件描述符。

int socket(int domain, int type, int protocol);socket函数中主要包含的3个参数:domain是我们所要选取的ip协议(主要有ipv4和ipv6,ipv4较早使用,ipv6目前使用),目前还有好多在使用ipv4,因此这里选用ipv4;type是选用TCP协议(传输较为稳定)或UDP协议(传输不稳定,但传输速度较快);第三个参数不太清楚含义,一般选择0,默认处理。

socket函数的返回值就是类似于之前所学习的文件描述符。

        第二步:bind绑定sockfd和当前电脑的ip地址及端口号。

int bind(int socket, const struct sockaddr *address,socklen_t address_len);bind的函数主要包含3个参数,第一个参数是类似于文件描述符sockfd(即socket函数的返回值),第二个参数是一个结构体,主要包含设置的端口号(一台pc电脑有多个软件,一个软件就配置一个端口,便于区分)、服务器IP地址(通过ifconfig来获取)、所选取的ip协议(ipv4或者ipv6);注意:我们所看到的服务器IP地址是点十进制的形式,要通过inet_addr()函数或者inet_pton()函数转化为电脑所能识别的十六进制形式。第三个参数是结构体的大小,主要是因为不知道是ipv4还是ipv6,所以通过获取该结构体大小来确定所选取的IP协议。

 

        第三步:建立监听窗口;//类似于监听有哪些设备连接到了服务器

        int listen(int socket, int backlog);listen函数相对简单,主要包含了2个参数。第一个参数是socket函数的返回值;第二个参数是设置的所允许连接服务器客户端口的数量(个人理解是这样)。

        第四步:建立接收等待事件;//等待客户端口来连接

         int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);accept函数主要包含三个参数:第一个参数是socket函数的返回值;第二个参数也是第二步所设置的结构体;第三个参数同样是结构体的大小。

       至此,我们的服务器就创建成功了,接下来创建客户端,主要分为两步。

      第一步:打开socket文件描述符。//同建立服务器的做法相同

      第二步:通过connet连接服务器。

      int connect(int socket, const struct sockaddr *address, socklen_t address_len);connect函数主要包含了3个参数,与建立服务器时所使用的bind函数类似,这里不多太多介绍。

     至此,我们的客户端口也建立成功,现在客户端就可以与服务器相连了;

 

  附录代码:

/*建立服务器*/

  #include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>


using namespace std;

#define SERVERADDR "192.168.237.129"
#define MYPORT 6003
#define BACKLOG 100
int main(){
    int sockfd=-1;
    int ret=-1;
    socklen_t len=0;
    struct sockaddr_in seraddr={0};
    struct sockaddr_in cliaddr={0};
    //第一步:打开socket文件描述符
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0){
        cout<<"socket error!"<<endl;
        return -1;
    }
    cout<<"sockfd :"<<sockfd<<endl;
    //第二步:bind绑定sockfd和当前电脑的ip地址及端口号
    seraddr.sin_family=AF_INET;
    seraddr.sin_port=htons(MYPORT);
    seraddr.sin_addr.s_addr=inet_addr(SERVERADDR);
    ret=bind(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));
    if(ret<0){
        cout<<"bind error!"<<endl;
        return -1;
    }
    cout<<"bind ret:"<<ret<<endl;
    //第三步:建立监听窗口
    ret=listen(sockfd,BACKLOG);
    if(ret<0){
        cout<<"listen error"<<endl;
        return -1;
    }
    cout<<"listen ret:"<<ret<<endl;
    ret=accept(sockfd,(struct sockaddr*)&cliaddr,&len);
    cout<<"hahaha ret"<<ret<<endl;
    return 0;
}

 

/*建立客户端*/

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>


using namespace std;

#define SERVERADDR "192.168.237.129"
#define MYPORT 6003

int main(){
    int sockfd=-1;
    int ret=-1;
    socklen_t len=0;
    struct sockaddr_in seraddr={0};
    struct sockaddr_in cliaddr={0};
    //第一步:打开socket文件描述符
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0){
        cout<<"socket error!"<<endl;
        return -1;
    }
    cout<<"sockfd :"<<sockfd<<endl;
    //第二步:bind绑定sockfd和当前电脑的ip地址及端口号
    seraddr.sin_family=AF_INET;
    seraddr.sin_port=htons(MYPORT);
    seraddr.sin_addr.s_addr=inet_addr(SERVERADDR);
    ret=connect(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));
    if(ret<0){
        cout<<"connect error!"<<endl;
        return -1;
    }
    cout<<"connet successfully ret:"<<ret<<endl;
    return 0;
}

 

 


 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值