Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查看Debian上运行的C程序中的TCP头字段_C_Sockets_Tcp - Fatal编程技术网

查看Debian上运行的C程序中的TCP头字段

查看Debian上运行的C程序中的TCP头字段,c,sockets,tcp,C,Sockets,Tcp,我已经成功地创建了一个“echo客户端”,在继续我的项目之前,我想增加健壮性。值得注意的是,我希望查看TCP头中的“TCP窗口大小”值,并确保不会用下一次传输淹没服务器 如果不使用原始套接字和自己形成/解析TCP头,我不确定这是否可行。虽然这不是不可能的,但如果可能的话,我更愿意使用内置函数访问当前代码的标题。如果你有任何建议,请告诉我 #include "../include/a8gcc.hpp" #include <stdio.h> #include <stdlib.h&

我已经成功地创建了一个“echo客户端”,在继续我的项目之前,我想增加健壮性。值得注意的是,我希望查看TCP头中的“TCP窗口大小”值,并确保不会用下一次传输淹没服务器

如果不使用原始套接字和自己形成/解析TCP头,我不确定这是否可行。虽然这不是不可能的,但如果可能的话,我更愿意使用内置函数访问当前代码的标题。如果你有任何建议,请告诉我

#include "../include/a8gcc.hpp"

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

#define buffer_len 512
/* server address */
#define SERVER "192.168.2.115"
/* server port number */
#define SERVPORT 10001


 int main(void)
{ 

    struct sockaddr_in serv_addr;
    struct hostent *server;
    int sock_fd, num_read = 0;
    char in_data[buffer_len];

    printf("is_ethernet from GCC");
    setbuf(stdout, NULL);

    sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    if(sock_fd < 0){
        perror("Opening socket error");
        exit(1);
    }else{
        printf("Opening the socket...OK.\n");
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    server = gethostbyname(SERVER);
    if(server == NULL){
        printf("%s \n", h_errno);
        perror("getting host address error");
        exit(1);
    }
     bcopy((char *)server->h_addr,
             (char *)&serv_addr.sin_addr.s_addr,
             server->h_length);

    serv_addr.sin_port = htons(SERVPORT);

    if (connect(sock_fd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0){
        perror("ERROR connecting");
        exit(1);
    }


    while(1){
        num_read = read(sock_fd,in_data,buffer_len);
        write(sock_fd,in_data,num_read);
    }

    return 0;
}
#include“./include/a8gcc.hpp”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义缓冲区长度512
/*服务器地址*/
#定义服务器“192.168.2.115”
/*服务器端口号*/
#定义SERVPORT 10001
内部主(空)
{ 
服务地址中的结构sockaddr\u;
结构主机*服务器;
int sock\u fd,num\u read=0;
数据中的字符[缓冲区长度];
printf(“是GCC的以太网”);
setbuf(标准输出,空);
sock\u fd=套接字(AF\u INET,sock\u STREAM,0);
if(sock_fd<0){
perror(“打开插座错误”);
出口(1);
}否则{
printf(“打开套接字…确定。\n”);
}
bzero((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
服务器=gethostbyname(服务器);
如果(服务器==NULL){
printf(“%s\n”,h\u errno);
perror(“获取主机地址错误”);
出口(1);
}
b复制((字符*)服务器->h_地址,
(char*)和serv_addr.sin_addr.s_addr,
服务器->h_长度);
serv_addr.sin_port=htons(SERVPORT);
if(connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
perror(“错误连接”);
出口(1);
}
而(1){
num_read=read(sock_fd、in_数据、buffer_len);
写入(sock\u fd、in\u数据、num\u读取);
}
返回0;
}

我认为您不可能从代码中检查TCP/IP头的实际内容,除非您打算使用原始套接字并自己生成数据包:(很抱歉!

无论如何,您都不会让下一次传输充斥服务器;TCP层的功能之一是确保不会发生这种情况。因此,我不担心这一点。我正在连接到串行到以太网设备,串行流的写入速度可能比以太网流慢得多。制造商我们将设备设置为在TCP窗口大小中报告剩余的串行缓冲区大小,因此我非常希望将该数据返回到我的程序中,以确保我没有压过他们的设备。对,TCP层将自动处理该问题。特别是,串行到以太网设备的软件所要做的就是不调用recv()除非/直到它的串行缓冲区中有一些可用的空间。只要它这样做(据推测是这样做的),TCP层就会处理其余的事务——特别是,它们的TCP堆栈会告诉您的TCP堆栈变慢,这反过来会导致您的写()调用不再返回一段时间。它是由TCP为您处理的,因此您不需要编写自己的特殊逻辑来处理此问题(与使用UDP不同,如果您使用UDP,则您会这样做).你说得对,我刚刚在一个串行到以太网设备的以太网端口发送了一个22MB的数据,虽然传输需要一段时间,但TCP层负责调整窗口大小,我这边没有任何干预!谢谢你帮助我实现这一点。