Linux系统编程—网络编程—socket代码实现

Posted 是光哥呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程—网络编程—socket代码实现相关的知识,希望对你有一定的参考价值。

socket代码实现

一、服务端步骤:

1.socket

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

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

第一个参数domain设置为“AF_INET”。
第二个参数是套接口的类型:SOCK_STREAM或
SOCK_DGRAM。第三个参数设置为0。
系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。

2.bind

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

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

第一个参数sockfd是由socket()调用返回的套接口文件描述符。
第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。
第三个参数addrlen可以设置成sizeof(structsockaddr)。

查找struct sockaddr_in过程
i不区分大小写,r递归,n显示行号 *在当前目录底下在这里插入图片描述

3.listen

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

       int listen(int sockfd, int backlog);

sockfd 一个已绑定未被连接的套接字描述符
backlog 连接请求队列(queue of pending connections)
的最大长度(一般由2到4)。用SOMAXCONN则为系统给出的最大值

4.accept

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

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

socket:套接口描述字,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
成功返回一个新的套接字描述符,失败返回-1

5.read

       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);

1.参数一为被读取的文件对应的文件描述符,第二个参数为缓存区,第三个参数为读取的字节数
2.功能:读取fd对应的文件,并将读取的数据保存到buf,以nbytes为读取单位
3.返回值:返回读取的字节数,-1表示读取失败,0表示读取结束

6.write

       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);

1.参数一为被写入的文件对应的文件描述符,第二个参数为缓存区,第三个参数为写入的字节数
2.功能:将buf里的数据写入fd对应的文件,以n为写入单位
3.返回值:返回写入的字节数,-1表示写入失败

服务器端代码

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

int main()
{
        int s_fd;
        int n_read;
        char readbuf[128];
        char *msg="i get your connect";

        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));

        //1.socket
        s_fd=socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }

        //2.bind
        s_addr.sin_family =AF_INET;//英特尔网域
        s_addr.sin_port   =htons(8989);//端口号 低于3000一般是操作系统用的 用户一般用5000-9000 htons()生成网络字节序
        inet_aton("127.0.0.1",&s_addr.sin_addr);

        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen      
        listen(s_fd,10);//监听10个连接

        //4.accept
        int clen=sizeof(struct sockaddr_in);
        int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd==-1){
                perror("accept");
        }
        printf("get connetc:%s\\n",inet_ntoa(c_addr.sin_addr));

        //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;
}

二、客户端步骤:

1.socket
同服务端
2.connect

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

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

第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。
第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。
第三个参数可以使用sizeof(structsockaddr)而获得。

3.send
同服务端

4.read
同服务端

客户端代码

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

int main()
{
        int c_fd;
        int n_read;
        char readbuf[128];
        char *msg="msg from client";

        struct sockaddr_in c_addr;

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

        //1.socket
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
                perror("socket");
                exit(-1);
        }

        c_addr.sin_family =AF_INET;//英特尔网域
        c_addr.sin_port   =htons(8989);//端口号 低于3000一般是操作系统用的 用户一般用5000-9000 htons()生成网络字节序
        inet_aton("127.0.0.1",&c_addr.sin_addr);

        //2.connect
        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-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 serve:%d,%s\\n",n_read,readbuf);
        }

        return 0;
}

运行效果如图:
在这里插入图片描述

以上是关于Linux系统编程—网络编程—socket代码实现的主要内容,如果未能解决你的问题,请参考以下文章

Linux操作系统 - 网络编程socket

Linux系统与网络编程13:Socket多线程

socket编程模拟linux下的ssh代码实现

Linux:UDP Socket编程(代码实战)

Linux:UDP Socket编程(代码实战)

linux系统UDP的socket通信编程2