linux 网络编程

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

建立新的通信端口

int domain  网络层协议 可以填 AF_INET表示IPv4AF_INET6表示IPv6

int type  传输类型 可以填SOCK_STREAM  表示TCP  SOCK_DGRAM  调试UDP

int protocol  指定传输协议编号,这里填0

返回值:成功→套接字文件描述符  失败→ -1

int serfd;
serfd = socket(AF_INET,SOCK_STREAM,0);
if(serfd == -1)
{
  perror(“socket fail”);
  exit(-1);
}

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

将服务器的地址信息与套接字进行绑定

int sockfd          套接字文件描述符

const struct sockaddr *addr  指向服务器地址信息的指针

struct sockaddr_in {
  unsigned short int sin_family;  网络层协议对应的宏 AF_INET表示IPv4

  uint16_t sin_port;        端口号

  struct in_addr sin_addr;      IP地址
  unsigned char sin_zero[8];     无意义
}

struct in_addr {

  uint32_t s_addr;        IP地址 这里是32位的二进制 

}

socklen_t addrlen      服务器地址信息长度 sizeof(struct sockaddr)

返回值:成功 0  失败-1 

 1 #include <sys/socket.h>
 2 #include <netinet/in.h>
 3 #include <arpa/inet.h>
 4 
 5 //IP地址
 6 #define IP_ADDR 192.168.1.1
 7 //端口号
 8 #define PORT_name 2222
 9 
10 //字节序转换,把主机的字节序转换成网络字节序
11 sin_port = htons(PORT_name);
12 
13 //把十进制IP转化为二进制,并返回给上述中的结构体成员
14 s_addr = inet_addr(IP_ADDR);

int listen(int sockfd, int backlog);

创建监听队列 

int sockfd    套接字文件描述符

int backlog    监听队列长度 等待连接的客户端个数 

返回值: 成功 0  失败  -1 

int ret;
ret = listen(serfd , 10);
if(ret == -1)
{
   perror(“listen fail”);
   exit(-1);
}

int accept(int s,struct sockaddr * addr,int * addrlen);

等待一个客户端与之链接,使用一次连接一个客户端

int s            服务器套接字文件描述符

struct sockaddr * addr    指向客户端地址

int * addrlen        指向客户端地址信息长度

返回值:成功返回客户端套接字文件描述符    失败 -1 

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

等待接收网络通信的数据

int sockfd     通信对方的套接字文件描述符 

void *buf      指向接受内容

size_t len      接收的最大长度  单位byte

int flags      填0

返回值: 实际接收数据长度 单位byte  失败 -1

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

在网络通信中发送内容

int sockfd        对方的套接字文件描述符

const void *buf      发送内容的指针

size_t len        发送长度

int flags          填0

返回值:成功返回实际发送的长度   失败 -1

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

客户端主动连接服务器 (服务器必须已经在accept等待中)

int sockfd            套接字文件描述符

const struct sockaddr *addr      指向服务器地址信息的指针

socklen_t addrlen         服务器地址信息的长度 

返回值: 成功 0 失败 -1

int sendto( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;

往指定地址的主机发送消息

int s              套接字文件描述符

const void * msg          发送内容的指针

int len              发送的长度

unsigned int flags          一般填0

const struct sockaddr * to      指向对方地址信息的指针

int tolen              地址信息长度

返回值: 成功 发送信息数据的长度 失败 -1 

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

接收一个数据并获得发送方地址信息

int sockfd            套接字文件描述符  

void *buf            储存接收到的信息

size_t len            预计接受长度

int flags            一般填0

struct sockaddr *src_addr      储存发送方地址信息

socklen_t *addrlen        发送方地址信息的长度

返回值: 成功 接受信息数据的长度   失败 -1 

TCP案例:

客户端:

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

#define  SERVER_IP  "192.168.1.7"
#define  PORT_NUM    11111
typedef  struct sockaddr  SA;
typedef  struct sockaddr_in  SIN;

int main(void)
{
    char t_buf[40];
    char r_buf[40];
    SIN seraddr,cliaddr;
    int serfd,clifd;
    int ret;
    int recv_len,send_len;
    socklen_t addrlen;
    //1. 创建套接字
    serfd = socket(AF_INET,SOCK_STREAM,0);
    if(serfd == -1)
    {
    perror("socket fail");
    exit(-1);
    }

    //2. 编写服务器地址信息
    bzero(&seraddr,sizeof(SIN));
    seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
    seraddr.sin_port = htons (PORT_NUM) ;
    seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址

    //3. 连接服务器
    ret = connect(serfd , (SA*)&seraddr , sizeof(SA));
    if(ret == -1)
    {
    perror("connect fail");
    exit(-1);
    }

    printf("connect success
");
    
    //4. 数据传输
    while(1)
    {
        
        scanf("%s",t_buf);
        send_len = send(serfd , t_buf , sizeof(t_buf) , 0);
        printf("send:%s
",t_buf);
        printf("send succese!");
/*
        recv_len = recv(serfd , r_buf , sizeof(r_buf) , 0);
        printf("recv:%s
",r_buf);
*/
    }

    //5. 结束通信
    close(serfd);

    exit(0);
}

服务器:

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

#define  SERVER_IP  "192.168.1.7"
#define  PORT_NUM    11111
typedef  struct sockaddr  SA;
typedef  struct sockaddr_in  SIN;

int main(void)
{
    char t_buf[40];
    char r_buf[40];
    SIN seraddr,cliaddr;
    int serfd,clifd;
    int ret;
    int recv_len,send_len;
    socklen_t addrlen;
    //1. 创建套接字
    serfd = socket(AF_INET,SOCK_STREAM,0);
    if(serfd == -1)
    {
    perror("socket fail");
    exit(-1);
    }

    //2. 编写服务器地址信息
    bzero(&seraddr,sizeof(SIN));
    seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
    seraddr.sin_port = htons (PORT_NUM) ;
    seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址

    //3. 将服务器地址信息与套接字进行绑定
    ret = bind(serfd,(SA*)&seraddr,sizeof(SA));
    if(ret == -1)
    {
    perror("bind fail");
    exit(-1);
    }

    //4. 设置监听队列
    ret = listen(serfd , 10);
    if(ret == -1)
    {
    perror("listen fail");
    exit(-1);
    }

    //5. 等待与客户端连接
    clifd = accept(serfd,(SA*)& cliaddr,&addrlen);
    if(clifd == -1)
    {
    perror("accept fail");
    exit(-1);
    }
    
    printf("connect success
");
    
    //6. 数据传输
    while(1)
    {
        
        recv_len = recv(clifd,r_buf,sizeof(r_buf),0);
        printf("recv:%s
",r_buf);
        printf("received succese!");
        /*
        scanf("%s",t_buf);
        send_len = send(clifd,t_buf,sizeof(t_buf),0);
        printf("send:%s
",t_buf);
        */
    }

    //7. 结束通信
    close(clifd);
    close(serfd);

    exit(0);
}

UDP:

客户端:

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

#define  SERVER_IP  "192.168.1.7"
#define  PORT_NUM    11111
typedef  struct sockaddr  SA;
typedef  struct sockaddr_in  SIN;

int main(void)
{
    char t_buf[40];
    char r_buf[40];
    SIN seraddr,cliaddr;
    int serfd,clifd;
    int ret;
    int recv_len,send_len;
    socklen_t addrlen;
    //1. 创建套接字
    serfd = socket(AF_INET,SOCK_DGRAM,0);
    if(serfd == -1)
    {
    perror("socket fail");
    exit(-1);
    }

    //2. 编写服务器地址信息
    bzero(&seraddr,sizeof(SIN));
    seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
    seraddr.sin_port = htons (PORT_NUM) ;
    seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址

    //3. 连接服务器
    ret = connect(serfd , (SA*)&seraddr , sizeof(SA));
    if(ret == -1)
    {
    perror("connect fail");
    exit(-1);
    }

    //先发送客户姓名
    /*
    printf("connect success
");
    printf("please input your name:
");
    bzero(t_buf,sizeof(t_buf));
    scanf("%s",t_buf);
    send_len = send(serfd , t_buf , sizeof(t_buf) , 0);
    */
    //4. 数据传输
    while(1)
    {
        //清除输入缓冲区,冲洗流中的信息
        fflush(stdin);
        bzero(t_buf,sizeof(t_buf));
        scanf("%s",t_buf);
        send_len = send(serfd,t_buf,sizeof(t_buf),0);
        printf("send to server:%s
",t_buf);
        if(strcmp(t_buf,"QUIT")==0)
        {
            close(serfd);
            exit(0);
        }
    }

    //5. 结束通信
    close(serfd);
    exit(0);
}

服务器:

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

#define  SERVER_IP  "192.168.1.7"
#define  PORT_NUM    11111
typedef  struct sockaddr  SA;
typedef  struct sockaddr_in  SIN;

int main(void)
{
    char t_buf[40]={0};
    char r_buf[40]={0};
    SIN seraddr,cliaddr;
    int serfd,clifd;
    int ret;
    int recv_len,send_len;
    socklen_t addrlen;
    int reuse=1;

    //1. 创建套接字
    serfd = socket(AF_INET,SOCK_DGRAM,0);
    if(serfd == -1)
    {
    perror("socket fail");
    exit(-1);
    }

    //2. 编写服务器地址信息
    bzero(&seraddr,sizeof(SIN));
    seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
    seraddr.sin_port = htons (PORT_NUM) ;
    seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址

    //3. 将服务器地址信息与套接字进行绑定
    ret = bind(serfd,(SA*)&seraddr,sizeof(SA));
    if(ret == -1)
    {
    perror("bind fail");
    exit(-1);
    }
    
    do
    {
    recv_len = recvfrom(serfd,r_buf,sizeof(r_buf),0,
            (SA*)&cliaddr,&addrlen);
    }
    while(recv_len == 0);
    printf("connect success
");
    //4. 数据传输
    while(1)
    {
        bzero(r_buf,sizeof(r_buf));
        recv_len = recvfrom(serfd,r_buf,sizeof(r_buf),0,
            (SA*)&cliaddr,&addrlen);
        printf("recv:%s
",r_buf);
        printf("client_addr is %s
", inet_ntoa(cliaddr.sin_addr));

    }

    //5. 结束通信
    close(serfd);

    exit(0);
}
原文地址:https://www.cnblogs.com/qifeng1024/p/11692833.html