WSOCK32.DLL htons函数

时间:2017-11-24 15:03:16

标签: sockets winapi visual-foxpro

在使用套接字的Visual FoxPro应用程序中,我们使用wsock32.dll并使用htons()函数将portnumber转换为TCP / IP网络字节顺序。它应返回0到65535之间的无符号短消息。当使用端口63333测试它时,它返回26103,但在安装Windows Fall Creators更新后,它返回一个更大的值:16213495。

示例FoxPro程序:

<div class="mat-table-container mat-elevation-z8">
  <mat-table #table [dataSource]="assessmentManualList">

    <ng-container cdkColumnDef="documentID">
      <mat-header-cell *cdkHeaderCellDef>  </mat-header-cell>
      <mat-cell *cdkCellDef="let row">
        <button mat-icon-button [matMenuTriggerFor]="menu">
          <mat-icon>more_vert</mat-icon>
        </button>
        <mat-menu #menu="matMenu">
          <button mat-menu-item>
            <mat-icon><i class="material-icons">content_copy</i></mat-icon>
            <span>Copy {{row.DocumentID}}</span>
          </button>
          <button mat-menu-item>
            <mat-icon><i class="fa fa-trash" aria-hidden="true"></i></mat-icon>
            <span>Delete {{row.documentID}}</span>
          </button>
        </mat-menu>
      </mat-cell>
    </ng-container>  

    <ng-container cdkColumnDef="textDetail">
      <mat-header-cell *cdkHeaderCellDef> Document </mat-header-cell>
      <mat-cell *cdkCellDef="let row"> {{row.textDetail}} </mat-cell>
    </ng-container> 

    <ng-container cdkColumnDef="isPublish">
      <mat-header-cell *cdkHeaderCellDef> Publish </mat-header-cell>
      <mat-cell *cdkCellDef="let row">
        {{row.isPublish}}
        <md-checkbox class="example-margin" [(ngModel)]="row.isPublish"> 
Checked </md-checkbox>  
      </mat-cell>            
    </ng-container> 
    <mat-header-row *cdkHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *cdkRowDef="let row; columns: displayedColumns;" (click)="selectedRow(row)" [class.active]="isSelected(row)"></mat-row>
  </mat-table>
</div>

结果值应该进入&#34; sockaddr&#34; connect()函数使用的结构,但端口只有2个字节的空间。

有谁知道这个Windows更新到wsock32函数发生了什么和/或有建议解决这个问题?

1 个答案:

答案 0 :(得分:0)

我将Windows 10 FCU功能与Windows 8进行了比较,Windows重新排序了寄存器用法并保存了一条AND指令。这很可能是编译器优化而不是源代码更改。因为左移半部分没有被屏蔽,所以你会在16-23位得到垃圾,但这些位应该被忽略。对于遵循Windows ABI的任何人来说,该功能仍然正确。

最好的解决方案是更新函数声明,使其使用16位整数类型。如果不可能,您可以使用支持转换的语言将数字转换为16位类型。最后一个选项是通过与0xffff进行AND运算来自行截断值:

htonsNumber = BitAnd(htons(portNumber), 0xffff)

简短is listed as a valid return type因此也应该有效:

DECLARE SHORT htons IN "wsock32.dll" INTEGER