socket 网络 编程

网络编程场景
自己是客户端站在5栋楼前,自己要找到5栋楼中的一座并进入某一间房间,这时第二座楼上有人在用汉语(tcp/udp)说话,我的ip地址(楼号)是…,我的端口号(房间号)是…,就是先告诉你你的ip地址和端口号,确定你的服务器在哪里,然后回房间监听(等待大家的来访,来了敲门)
在这里插入图片描述

Socket服务器和客户端的开发步骤
在这里插入图片描述

服务器开发
第一步
socket()获得一个套接字,返回套接字的描述符,后面都是基于这个描述符向外面进行网络访问,这个作用有点像open()
第二步
bind()为套接字添加信息,将ip地址和端口号绑定到套接字。
第三步
listen()监听网络连接
第四步
accept()监听到有客户端接入的时候,接受一个连接。
第五步
数据交互(read从网络通道上读数据,write向网络通道发数据)
第六步
关闭套接字,断开连接。
客户端开发
socket()给客户端一个通道,知道IP地址和端口号调用connect()连接,然后客户端write服务端read,服务端write客户端read。

linux提供的API简析
1、创建套接字时指定用哪种协议进行连接
在这里插入图片描述2、地址准备好
在这里插入图片描述

地址转换API
在这里插入图片描述
4、监听
在这里插入图片描述4、连接
在这里插入图片描述
数据收发
在这里插入图片描述
数据的收发第二套API

在这里插入图片描述客户端connect函数
在这里插入图片描述字节序转换API

在这里插入图片描述
查找结构体方法

在这里插入图片描述在这里插入图片描述-nir中 n表示显示行号,i表示不区分大小写,r表示逐行扫描

socket服务端代码演示

#include<stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>

int main()
{
        int s_fd;
        int n_read;
        char readbuf[128];
        char*msg="I have get your messange";
        //1.socket
        s_fd=socket(AF_INET,SOCK_STREAM,0);//AF_INET表示IPV4因特网域,SOCK_STREAM表示TCP协议
        if(s_fd==-1){
                perror("socket");//打印错误
                exit(-1);
        }

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        s_addr.sin_family=AF_INET;//IPV4因特网域
        s_addr.sin_port=htons(8988);//htons将字节序转换为网络字节序
        inet_aton("192.168.183.128",&s_addr.sin_addr);//sin_addr是ip地址
        //2.bind
		bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen
        listen(s_fd,10);
        int clen=sizeof(struct sockaddr_in);
        //4.accept
        int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);//这里的c_fd就是接下来的操作对象,s_fd继续等待其他客户端的接入,accept的第二个参数是接入服务器者的信息
        if(c_fd==-1){
                perror("accept");
        }
        printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//打印接入客户端的IP地址
        //5.read

        n_read=read(c_fd,readbuf,128);
        if(n_read ==-1){
                perror("read");
        }
        else{
                printf("get message :%d,%s\n",n_read,readbuf);
        }
        //6.write

        write(c_fd,msg,strlen(msg));
        return 0;
}

socket客户端代码演示

#include<stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>

int main()
{
        int c_fd;
        int n_read;
        char* readbuf;
        readbuf=(char *)malloc(128);
        char*msg="message from client";
        //1.socket
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
                perror("socket");
                exit(-1);
        }

        struct sockaddr_in c_addr;

        memset(&c_addr,0,sizeof(struct sockaddr_in));

        c_addr.sin_family=AF_INET;
        c_addr.sin_port=htons(8988);
        inet_aton("192.168.183.128",&c_addr.sin_addr);
        //2.connect
        if(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in))==-1){
                perror("connect");
                exit(-1);
        }
        //3.send

        write(c_fd,msg,strlen(msg));

        //4.read
        n_read=read(c_fd,readbuf,128);
        if(n_read ==-1){
                perror("read");
        }
        else{
                printf("get message from server:%d,%s\n",n_read,readbuf);
        }

        return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值