吹佬你的程序只能使用2位端口如80,90 ,而443 8080 等出错?
PROCEDURE _SetListenLPARAMETERS hWnd, szIP, nPort
LOCAL stWsaData, stSockAddr
this._CloseSocket()
this.hWnd = hWnd
stWsaData = REPLICATE(0h00, 398)
WSAStartup(0x202, @stWsaData)
this.hSocket = socket(2, 1, 0)
WSAAsyncSelect(this.hSocket, this.hWnd, WM_SOCKET, 8) && FD_ACCEPT
stSockAddr = BINTOC(2, "2RS"); && sin_family
+ BINTOC(htons(nPort), "2RS"); && sin_port 2RS
+ BINTOC(inet_addr(@szIP), "4RS"); && sin_addr
+ REPLICATE(0h00, 8)
IF _bind(this.hSocket, @stSockAddr, LEN(stSockAddr)) == -1
RETURN "不能绑定到IP:" + szIP + " 端口:" + TRANSFORM(nPort)
ELSE
listen(this.hSocket, 5) && 监听,队列限制5
RETURN "启动服务成功"
ENDIF
ENDPROC
怎么优化一下,也可以使用8000 ,或443等端口呢?
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
sin_family:指代协议族,在socket编程中只能是AF_INET
sin_port:存储端口号(使用网络字节顺序)
sin_addr:存储IP地址,使用in_addr这个数据结构
sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
而其中in_addr结构的定义如下:
typedef struct in_addr {
union {
struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
struct{ unsigned short s_w1, s_w2;} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;
阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
第三种用一个长整型来表示IP地址。
给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如addrto.sin_addr.s_addr=inet_addr("192.168.0.2");
其反函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串。
[此贴子已经被作者于2023-8-12 14:56编辑过]