| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 581 人关注过本帖
标题:吹佬你的程序只能使用2位端口如80,90 ,而443 8080 等出错?
取消只看楼主 加入收藏
ljb8864
Rank: 1
等 级:新手上路
帖 子:169
专家分:7
注 册:2023-6-4
结帖率:2.78%
收藏
已结贴  问题点数:20 回复次数:4 
吹佬你的程序只能使用2位端口如80,90 ,而443 8080 等出错?
    PROCEDURE _SetListen
        LPARAMETERS 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编辑过]

搜索更多相关主题的帖子: this unsigned 地址 IP 端口 
2023-08-12 14:43
ljb8864
Rank: 1
等 级:新手上路
帖 子:169
专家分:7
注 册:2023-6-4
收藏
得分:0 
其它语言而且可以绑定多个端口
int main()
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int ports[PORTS_COUNT] = {8080, 8888, 9999}; // 需要绑定的端口号
    // 创建TCP套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        perror("ERROR opening socket");
    // 绑定多个端口
    for (int i = 0; i < PORTS_COUNT; ++i)
    {
        bzero((char *) &serv_addr, sizeof(serv_addr));
        portno = ports[i];
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(portno);
        if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
            perror("ERROR on binding");
    }
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);
    // 接收客户端连接
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0)
        perror("ERROR on accept");
    bzero(buffer, 256);
    int n = read(newsockfd, buffer, 255);
    if (n < 0)
        perror("ERROR reading from socket");
    printf("Here is the message: %s\n", buffer);
    close(newsockfd);
    close(sockfd);
    return 0;
}
2023-08-12 15:13
ljb8864
Rank: 1
等 级:新手上路
帖 子:169
专家分:7
注 册:2023-6-4
收藏
得分:0 
回复 2楼 吹水佬
没有占用的?提示这句出错

        stSockAddr = BINTOC(2, "2RS");                   && sin_family
                   + BINTOC(htons(nPort), "2RS");        && sin_port  2RS  htons(nPort)
                   + BINTOC(inet_addr(@szIP), "4RS");    && sin_addr   反函数是inet_ntoa
                   + REPLICATE(0h00, 8)
2023-08-12 15:21
ljb8864
Rank: 1
等 级:新手上路
帖 子:169
专家分:7
注 册:2023-6-4
收藏
得分:0 
回复 5楼 吹水佬
BINTOC(htons(8080), "2RS") 这句出错
2023-08-12 15:25
ljb8864
Rank: 1
等 级:新手上路
帖 子:169
专家分:7
注 册:2023-6-4
收藏
得分:0 
回复 9楼 吹水佬
成功!完美!
2023-08-12 15:53
快速回复:吹佬你的程序只能使用2位端口如80,90 ,而443 8080 等出错?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015865 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved