sockets - 套接字编程客户端连接

标签 sockets tcp serversocket

我正在使用客户端-服务器编程,我指的是这个 link并且我的服务器已成功运行。

  1. 我需要不断地向服务器发送数据。
  2. 我不想每次在发送每个数据包之前都调用 connect()。所以第一次我只是创建了一个套接字并发送了第一个数据包,其余的数据我只是使用 write() 函数将数据写入套接字。

但我的问题是,如果服务器不存在或我的以太网被禁用,我的问题是在连续发送数据时它仍然成功地将数据写入套接字。

有什么方法可以让我一次创建套接字并在知道服务器故障的情况下连续发送数据?

这样做的主要原因是,在服务器端,我使用的是 GPRS 调制解调器,每次为每个数据包调用 connect() 函数时,调制解调器都会挂起。

我使用下面的代码创建套接字

Gprs_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (Gprs_sockfd < 0)
{
  Display("ERROR opening socket");
  return 0;
}
server = gethostbyname((const char*)ip_address);
if (server == NULL)
{               
  Display("ERROR, no such host");                
  return 0;
}

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(Gprs_sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
  Display("ERROR connecting");
  return 0;
}

每次我使用下面的代码写入套接字

n = write(Gprs_sockfd,data,length);
if(n<0)
{
  Display("ERROR writing to socket");
  return 0;
}   

提前致谢

最佳答案

TCP 旨在容忍临时故障。它进行字节排序、确认,并在必要时进行重传。所有未确认的数据都缓冲在内核网络堆栈中。如果我没记错的话,默认设置是三次重传尝试(如果我错了,请纠正我),并带有指数退避超时。如果不是几分钟,那很快就会增加几十秒。

我的建议是将应用程序级确认设计到您的协议(protocol)中,这意味着服务器将发送一个简短的回复,说它收到了到目前为止那么多的数据,比如说每秒。如果客户端在 3 秒内没有收到 suck ack,则客户端知道连接不可用并可以关闭它。顺便说一句,使用非阻塞套接字和轮询函数(如 select(2))会更容易做到这一点。或 poll(2) .

编辑0:

我认为这在这里非常相关 - "The ultimate SO_LINGER page, or: why is my tcp not reliable" .

关于sockets - 套接字编程客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259130/

相关文章:

Java <-> C 桥

c++ - 第一次发送后未立即生成 SIGPIPE

java - spring integration tcp-out-bound异常

java - 为什么来自多个套接字的输入无法正确更新 UI?

c - 如何在 C 的套接字上发送/接收字符串数组

规范名称或 IP 地址 - 套接字、linux 和 C

c++ - 0MQ - 获取消息 ip

actionscript-3 - Adobe AIR : ServerSocketConnectEvent not firing for localhost connections

perl - 多客户端全双工 Perl 套接字

delphi - 如何将 TServerSocket 绑定(bind)到特定 IP 地址