在使用套接字的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函数发生了什么和/或有建议解决这个问题?
答案 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