LINUX网络编程学习指导(一)

一、网络编程概述

详情见见本人另外一篇博文链接: 计算机网络.

二、字节序是什么?

详情见本人另外一篇博文链接: 字节序.

三、socket编程步骤

在这里插入图片描述

四、编程所涉及函数API讲解

1.socket,创建套接字。

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

  参数一: 我们大部分是在IPV4的环境,所以我们将第一1个承参数配置为AF_INET 。
  参数二:我们这里选择TCP协议进行数据传输,所以配置参数为SOCK_STREAM,
  参数三:就配置为0即可。

2.bind函数,为套接字添加信息,比如我们添加的IP地址和端口号。

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

  参数一:就是创建套接字的标识符。
  参数二:通过查询函数原型我们看到系统上面显示的是:

struct sockaddr {
      sa_family_t sa_family;
       char        sa_data[14];
}

//我们用下面这个来代替
struct sockaddr_in {
  __kernel_sa_family_t  sin_family;     /* Address family               */
  __be16                sin_port;       /* Port number                  */
  struct in_addr        sin_addr;       /* Internet address             */           
//结构体第一个是英特网域的意思,需要我们配置为AF_INET
//结构体第二个是端口号
//结构体第三个又是一个结构体中的一个数据,是IP地址,配置的过程中需要转换位小端字节序,所以我们需要查询struct in_addr 结构体中的sin_addr;
struct in_addr {
        __be32  s_addr;
};

3.listen,监听函数,用来监听网络连接。

  int listen(int sockfd, int backlog);

  参数一:就是套接字返回的标识符。
  参数二:backlog参数定义了sockfd的挂起连接队列可能增长到的最大长度。如果连接请求在队列满时到达,客户端可能会收到一个指示错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便以后重新尝试连接时获得成功,这里我们配置为10。

4.accept函数接受客户端连接,连接成功会返回客户端的套接字的标识通道,这个新的套接字和socket函数创建的套接字不是一个概念,我们的服务器和客户端需要通过这个新的套接字进行通信。

 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  参数一:套接字标识符也就是listen函数中设置为监听状态的套接字。
  参数二:是用来保存客户端套接字对应的内存空间变量包括客户端IP和端口信息等,可以参照我上面给出的结构体来查看。
  参数三:参数二内存空间的占地大小。
  API函数的讲解就到这里了。下面开始写代码。

五、代码展示

//sever
#include<stdio.h>
#include<netinet/in.h>
//#include<linux/in.h>//会与下面的文件起冲突
#include<string.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>

int main()
{
        int s_fd;
        int n_read;//the return value of read

        struct sockaddr_in c_in;
        struct sockaddr_in client_in;

        char buff[128];
        char *str = "hello!";


        memset(&c_in,0,sizeof(struct sockaddr));
        memset(&client_in,0,sizeof(struct sockaddr));


        s_fd = socket(AF_INET,SOCK_STREAM,0);

//      int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);    

        if(s_fd==-1)
        {
                perror("socket");
                exit(-1);
        }

        c_in.sin_family = AF_INET;
        
        c_in.sin_port = htons(8989);//转化为网络能识别的字节序
        
        inet_aton("127.0.0.1",&c_in.sin_addr);//同上
        
        int size = sizeof(struct sockaddr_in);

        bind(s_fd,(struct sockaddr *)&c_in,size);

        listen(s_fd,10);

        int len = sizeof(struct sockaddr );

        int c_fd = accept(s_fd,(struct sockaddr*)&client_in,&len);

        if(c_fd!=-1)
        {
                  printf("connect!\n");
                  printf("the client IP is :%s\n",inet_ntoa(client_in.sin_addr));

        }else
        {
                printf("failed!\n");
        }
        write(c_fd,str,sizeof(str));
        n_read = read(c_fd,buff,128);
        if(n_read==-1)
        {
                printf("read failed!\n");
        }
        else
        {
                printf("%d the msg is :%s\n",n_read,buff);
        }
        return 0;

  我们可以通过telnet 指令用来检测是否已经连接成功。但是很奇怪的就是我们用Windows的CMD连接不上虚拟机的网络。
在这里插入图片描述
  测试成功!!!链接: 网络编程二.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值