小编Son*_*nny的帖子

在C中设置TCP接收窗口并在Linux中使用tcpdump

我正在运行一个运行2.6.9-55.ELsmp,x86_64的Linux机器.

我正在尝试使用C使用setsockopt()函数设置TCP接收窗口.我尝试以下操作:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));
Run Code Online (Sandbox Code Playgroud)

上面的代码段位于从服务器接收数据的客户端程序中.当我启动程序接收并观察tcpdump输出时,我会观察窗口协商,如下所示:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>
Run Code Online (Sandbox Code Playgroud)

我们看到客户端程序实际上正在协商一个与我在客户端程序中设置的窗口不同的窗口.但是,从我如何解释Steven的文本("TCP/IP Illustrated,第1卷")第20.4节开始,我相信你使用我使用的setsockopt()调用来影响他在第20.4节的第二个块引用中引用的内容(见上文) ).

我想知道我哪里出错了.

也许我对史蒂文斯所说的话的解释是错误的.在这种情况下,你能指出我设置接收缓冲区大小的正确方法吗?为了证明我的困惑,我在http://linux.die.net/man/7/tcp上提到Linux TCP套接字手册页(请参阅SO_RCFBUF上的评论).

我在这个故事里想念的是什么?如何控制接收缓冲区大小(并将其显示在tcpdump输出中)?请注意,我在这里提到套接字选项SO_RCFBUF的设置 - 我理解这是SYN中窗口协商中出现的内容.

任何输入都表示赞赏.

c linux tcp tcpdump setsockopt

10
推荐指数
1
解决办法
7072
查看次数

基于C++ stl的二进制序列化数据发送使用套接字进行网络传输:请不要使用Boost或Protobuf或者这样的sw爱好者

我需要通过网络将一些复杂的对象发送给对等体.我编写了代码来使用ostream序列化它们,并为需要序列化的对象中的每个类成员运算符<<.我编写的代码成功地用于序列化和网络发送(正确使用htonl(),htons()等 - 我通过以二进制格式写入ofstream(本地文件)检查了上述内容(std :: ios :: bin我的下一个任务是通过网络套接字写这个二进制数据,这是我遇到问题的地方.

我有Socket类,它将std :: string对象转换为C风格的字符串,然后通过套接字发送它们,如下所示:

int Socket::send (const std::string goodies) const
{
    status = ::send (socket, goodies.c_str(), goodies.size(), 0);
            return status;
}
Run Code Online (Sandbox Code Playgroud)

我在接收器中使用的相同Socket类使用recv()将传入消息放入std :: string,然后将其传递给反序列化应用程序:

int Socket::recv (std::string& goodies)
{
    char buf [1024];
    goodies = "";
    memset (buf, 0, 1025);

    int status = ::recv (socket, buf, 1024, 0);

    if (status < 0)
    {
        return -1;
    }
    else if (status == 0)
    {
        return 0;
    }
    else
    {
        goodies = buf;
        return status;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码进行发送: …

c++ networking serialization stl tcp-ip

5
推荐指数
2
解决办法
3915
查看次数

PrepareStatement/Commit序列在mysql/HikariCP webapp中不起作用

我有一个使用MySQL和HikariCP进行连接池的Web应用程序.我使用如此定义的单例连接池对象连接到我的池:

package com.webapp.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.log4j.Logger;

public class HikariConnectionPool
{
    private static final Logger log = Logger.getLogger(HikariConnectionPool.class.getName());
    private static volatile HikariConnectionPool hikariCP = null;
    private static HikariDataSource hikariDataSource = null;

    private HikariConnectionPool() // We don't want any other object creating this pool
    {  
        HikariConfig config = new HikariConfig();
        config.addDataSourceProperty("url","jdbc:mysql://remoteMYSQLServer:3306/webapp");
        config.addDataSourceProperty("user", "webapp");
        config.addDataSourceProperty("password", "password");
        config.setMinimumIdle(1);
        config.setMaximumPoolSize(2);
        config.setInitializationFailFast(true);
        config.setConnectionTestQuery("VALUES 1");
        config.setJdbcUrl("jdbc:mysql://remoteMYSQLServer:3306/webapp");
        config.setDriverClassName ("com.mysql.jdbc.Driver");

         hikariDataSource = new HikariDataSource (config);
   }

   public static …
Run Code Online (Sandbox Code Playgroud)

java mysql web-applications hikaricp

3
推荐指数
1
解决办法
2338
查看次数