小编reg*_*fry的帖子

写入封闭的本地TCP套接字不会失败

我的套接字似乎有问题.下面,您将看到一些分叉服务器和客户端的代码.服务器打开TCP套接字,客户端连接到它,然后关闭它.睡眠用于协调时间.在客户端关闭()之后,服务器尝试将write()写入其自己的TCP连接端.根据write(2)手册页,这应该给我一个SIGPIPE和一个EPIPE错误.但是,我没有看到这一点.从服务器的角度来看,写入本地已关闭的套接字成功,如果没有EPIPE,我无法看到服务器应该如何检测到客户端已关闭套接字.

在关闭其结束的客户端和尝试写入的服务器之间的间隙中,对netstat的调用将显示连接处于CLOSE_WAIT/FIN_WAIT2状态,因此服务器端应该绝对能够拒绝写入.

作为参考,我在Debian Squeeze上,uname -r是2.6.39-bpo.2-amd64.

这里发生了什么?


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/tcp.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>

#include <netdb.h>

#define SERVER_ADDRESS "127.0.0.7"
#define SERVER_PORT 4777


#define myfail_if( test, msg ) do { if((test)){ fprintf(stderr, msg "\n"); exit(1); } } while (0)
#define myfail_unless( test, msg ) myfail_if( !(test), msg )

int connect_client( char *addr, int actual_port )
{
    int client_fd;

    struct addrinfo hint;
    struct addrinfo …
Run Code Online (Sandbox Code Playgroud)

c sockets linux tcp glibc

22
推荐指数
1
解决办法
2万
查看次数

为什么 docker 不重用 docker-compose 的缓存层?

这是我在使用更大的 Dockerfile 时遇到的问题的简化示例。

这是一个Dockerfile

FROM alpine:latest AS base
COPY docker-compose.yml /tmp/docker-compose.yml
RUN touch /tmp/foo
Run Code Online (Sandbox Code Playgroud)

这是一个docker-compose.yml

version: '3.5'
services:
  web:
    build:
      context: .
Run Code Online (Sandbox Code Playgroud)

我期望的是docker build能够重用docker-compose构建的缓存层。我跑步时看到的docker-compose build web是:

  $ docker-compose build web
Building web
Step 1/3 : FROM alpine:latest AS base
 ---> f70734b6a266
Step 2/3 : COPY docker-compose.yml /tmp/docker-compose.yml
 ---> 764c54eb3dd4
Step 3/3 : RUN touch /tmp/foo
 ---> Running in 77bdf96af899
Removing intermediate container 77bdf96af899
 ---> 7d8197f7004f

Successfully built 7d8197f7004f
Successfully tagged …
Run Code Online (Sandbox Code Playgroud)

docker dockerfile docker-compose

7
推荐指数
2
解决办法
921
查看次数

Mercurial关键字扩展可在每次提交时进行扩展

我需要使用hg关键字扩展将构建日期和修订嵌入到源文件中.撇开整个"你真的不想做那个"的论点,我怎么能这样做呢?

这是我的源文件(lib/foo/version.rb)看起来像什么(恰好是Ruby,但从我的构建中我没有"编译"步骤的观点来看,这只是相关的,我可以做-DREVISION ="$( hg id)"in):

module Foo
  VERSION = {
    :date => "$Date$",
    :changeset => "$Revision$"
  }
end
Run Code Online (Sandbox Code Playgroud)

问题是$ Revision $和$ Date $随着该文件的变更集和提交日期而扩展,而我需要的是整个存储库的tip更改集和提交日期.

我没有看到可以使用的明显模板hg help templates,关键字扩展也没有提到具有全局范围的任何内容.我正在尝试做什么?

mercurial commit keyword

6
推荐指数
1
解决办法
1124
查看次数

404s在挤压时将黑色战争部署到码头

我有一种感觉,我错过了一些明显的东西,但我不知道从哪里开始寻找.

我有一个新的黑色应用程序,因此创建:

$ lein noir new hiworld
Run Code Online (Sandbox Code Playgroud)

我向src/hiworld/server.clj添加了一个新的页面处理程序:

(ns hiworld.server
  (:require [noir.server :as server]))
(server/load-views "src/hiworld/views/")

(def handler (server/gen-handler {:mode :dev
                                  :ns 'hiworld}))
Run Code Online (Sandbox Code Playgroud)

我将project.clj设置为响铃:

(defproject hiworld "0.1.0-SNAPSHOT"
            :description "FIXME: write this!"
            :dependencies [[org.clojure/clojure "1.3.0"]
                           [noir "1.2.2-SNAPSHOT"]]
            :dev-dependencies [[lein-ring "0.5.4"]]
            :ring {:handler hiworld.server/handler}
            :main hiworld.server)
Run Code Online (Sandbox Code Playgroud)

检查它在本地工作:

$ lein deps
$ lein ring server-headless
# elsewhere
$ curl -I localhost:3000/welcome
HTTP/1.1 200 OK
Date: Mon, 20 Feb 2012 08:51:15 GMT
Set-Cookie: ring-session=ef00a7ad-2061-4026-9d94-3ed86ec8c46c;Path=/
Content-Type: text/html; charset=utf-8
Content-Length: 0
Server: Jetty(6.1.25)
Run Code Online (Sandbox Code Playgroud)

我建立了一场战争:

$ lein …
Run Code Online (Sandbox Code Playgroud)

deployment servlets jetty clojure noir

6
推荐指数
1
解决办法
548
查看次数

如何让ActiveRecord :: Schema.define不登录到stdout?

我在文档中看不到这一点,但我认为这是一个已解决的问题.

我在Rails之外使用ActiveRecord,我的脚本加载从另一个应用程序转储的schema.rb.我想加载此架构而不将迁移输出转储到stdout,但替换ActiveRecord :: Base.logger不会将其关闭.我最重要的是要阻止噪音?

ruby activerecord ruby-on-rails

6
推荐指数
1
解决办法
819
查看次数

确定 GNU binutils 的目标和体系结构的“正确”方法是什么?

在我的构建链中,我需要这样做:

objcopy -I binary -O $BFDNAME -B $BFDARCH <this> <that>
Run Code Online (Sandbox Code Playgroud)

为了将二进制文件转换为库形式。因为我希望其他人能够使用它,所以我需要知道在运行构建时如何从他们的工具链中获取 $BFDNAME 和 $BFDARCH。我可以通过对我已经构建的文件运行 objdump -f 来在本地获取值,但是有没有更好的方法,不会让我仅仅为了获取配置值而编译废弃文件?

gcc gnu binutils

5
推荐指数
1
解决办法
3561
查看次数

访问附加到ELF二进制文件的数据

我有一个静态ELF二进制文件,它从zip文件中读取数据.为了简化分发,我想将zipfile附加到二进制文件,如下所示:

$ cat mydata.zip >> mybinary
Run Code Online (Sandbox Code Playgroud)

我知道这样做不会损害mybinary,但我不知道如何访问mydata.zip的内容.可能吗?如果是这样,怎么样?

在过去,我使用了附加数据然后附加数据长度的技巧,因此我所要做的就是打开二进制文件,读取流的最后一个int,回退那个长度然后开始解压缩,但是由于各种原因在这里不起作用(例如,我不能保证当需要zipfile时文件仍然在光盘上).

如果解决方案适用于OS X和MinGW,那么全面超级双倍加分.

linux gcc build elf

5
推荐指数
1
解决办法
1066
查看次数

如何从Windows 7中的驱动器号获取可移动设备的物理驱动器号?

我试图查找物理驱动器号(如,我需要N\\.\PhysicalDriveN打开读取的块设备)从光盘驱动器在Windows 7的驱动器盘符本页面表明IOCTL_STORAGE_GET_DEVICE_NUMBER应该工作,但它返回0表示C:和D的驱动器号:(其中D:是可移动驱动器),因此不能正确.还建议使用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,但在D:上失败并出现ERROR_INVALID_FUNCTION.

我不禁觉得我错过了某个关键概念.

这是我的代码:

#include "stdafx.h"
#include "Windows.h"


void printLastError(){
  DWORD lastError;
  DWORD bytesReturned;
  WCHAR outbuf[2048];

  lastError = GetLastError();

  bytesReturned = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
    NULL, lastError, LANG_USER_DEFAULT, outbuf, 2048, NULL);

  if (bytesReturned > 0){
    wprintf(outbuf);
  } else {
    printf("Error %d while formatting error %d\n", GetLastError(),     lastError);
  }
}

void readDeviceNumberByExtents(HANDLE hFile){
  BOOL ioctlSuccess;
  DWORD bytesReturned;

  VOLUME_DISK_EXTENTS vde;

  ioctlSuccess = DeviceIoControl(hFile,
    IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
    NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL);

    if (ioctlSuccess != 0){
      printf("%d\n", vde.Extents->DiskNumber );
    } else …
Run Code Online (Sandbox Code Playgroud)

winapi visual-c++ windows-7

4
推荐指数
1
解决办法
1万
查看次数

Erlang消息队列是否在进程间持久存在?

这应该是一个简单的问题,但我不知道我的方法很好地找到答案.

如果OTP管理程序在崩溃后重新启动gen_server,新的子进程是否会继承崩溃进程的消息队列,还是在崩溃之前发送但尚未被丢弃在地板上的旧子进程处理的消息?

erlang erlang-otp

4
推荐指数
1
解决办法
720
查看次数

如何从haskell中的IOError获取errno?

我在haskell平台上,在Debian Squeeze上安装了apt-get GHC 6.12.1.我如何从IOError中获取底层错误,因为我需要它在最初引发它的不同线程上?

我需要这个的原因是因为我正在实现一个网络协议,它暴露了线路上的实际errno值.我需要重建吗?

io haskell errno ghc

4
推荐指数
1
解决办法
210
查看次数

具有GCC的仅数据静态库

如何使用仅包含二进制数据的静态库(没有任何目标代码),并将该数据提供给C程序?这是我正在努力工作的构建过程和简化代码:

./datafile:

abcdefghij
Run Code Online (Sandbox Code Playgroud)

Makefile:

libdatafile.a:
  ar [magic] datafile

main: libdatafile.a
  gcc main.c libdatafile.a -o main
Run Code Online (Sandbox Code Playgroud)

main.c:

#define TEXTPTR [more magic]

int main(){
  char mystring[11];
  memset(mystring, '\0', 11);
  memcpy(TEXTPTR, mystring, 10);

  puts(mystring);
  puts(mystring);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期望从运行中获得的输出main当然是:

abcdefghijabcdefghij
Run Code Online (Sandbox Code Playgroud)

我的问题是:[魔法]和[更神奇]应该是什么?

c resources gcc build ld

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