2022-4-11 尝试发送TCP外带数据,只有最后一位被当成外带数据读取

发送数据端

#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main(void){
    
    
    //1.创建套接字
    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(fd == -1){
    
    
        perror("socket");
        exit(0);
    }

    //2.连接服务器端
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    inet_pton(AF_INET,"192.168.131.137",&serveraddr.sin_addr.s_addr);
    serveraddr.sin_port = htons(9999);
    int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
    if(ret == -1){
    
    
        perror("connect");
        exit(0);
    }

    //3.通信
    const char*oob_data = "abc";
    const char*normal_data = "123";
    send(fd,normal_data,strlen(normal_data),0);
    send(fd,oob_data,strlen(oob_data),MSG_OOB);
    send(fd,normal_data,strlen(normal_data),0);

    close(fd);
    return 0;
}

接受数据端

#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define BUF_SIZE 1024

int main(void){
    
    
    //1.创建 socket 套接字
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if (lfd == -1)
    {
    
    
        perror("socket");
        exit(0);
    }
    
    //2.绑定
    struct sockaddr_in sadder;
    sadder.sin_family = AF_INET;
    //inet_pton(AF_INET,"127.0.0.1",sadder.sin_addr.s_addr);服务端写的是本机的地址
    sadder.sin_addr.s_addr = INADDR_ANY;//0.0.0.0 表示任意网关的地址,一种简单的写法

    sadder.sin_port= htons(9999);
    
    //sockaddr 和 sockaddr_in 这两种类型的指针可以互相转换?
    int ret = bind(lfd,(struct sockaddr*)&sadder,sizeof(sadder));
    if (ret == -1)
    {
    
    
        perror("bind");
        exit(-1);
    }

    //3.监听
    ret = listen(lfd,8);
    if (ret == -1)
    {
    
    
        perror("listen");
        exit(-1);
    }

    //4.接收客户端连接
    struct sockaddr_in clientaddr;
    socklen_t len = sizeof(clientaddr);
    int cfd = accept(lfd,(struct sockaddr*)&clientaddr,&len);
    if (cfd == -1)
    {
    
    
        perror("accept");
        exit(-1);
    }
    //输出客户端信息
    char clientIP[16];
    inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientIP,sizeof(clientIP));
    unsigned short clientPort = ntohs(clientaddr.sin_port);
    printf("client ip is %s, port is %d.\n",clientIP,clientPort);

    //5.获取客户端的数据
    char buffer[BUF_SIZE];
    memset(buffer,'\0',BUF_SIZE);
    ret = recv(cfd,buffer,BUF_SIZE-1,0);
    printf("got %d bytes of normal data '%s'\n",ret,buffer);
    memset(buffer,'\0',BUF_SIZE);
    ret = recv(cfd,buffer,BUF_SIZE-1,MSG_OOB);
    printf("got %d bytes of oob data '%s'\n",ret,buffer);
    memset(buffer,'\0',BUF_SIZE);
    ret = recv(cfd,buffer,BUF_SIZE-1,0);
    printf("got %d bytes of normal data '%s'\n",ret,buffer);
    close(cfd);
    return 0;
}

最终的运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尝试用 tcpdump 抓包但是没有抓到不知道为什么。

猜你喜欢

转载自blog.csdn.net/weixin_51187533/article/details/124101160