发表于:2005-12-14 15:05:00
楼主
我们知道MODBUS/TCP的访问端口一般默认为 502.但是在linux下开发时要注意502端口在默认状态下禁止应用软件使用。必须通过获得系统的修改权限方可以调用。
例如:下面的程序
int sockfd, i;
struct sockaddr_in address;
size_t addrlength = sizeof(struct sockaddr_in);
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
printf("error on socket\n");
i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
address.sin_family = AF_INET;
address.sin_port = htons(PORT_NUMBER);
memset(&address.sin_addr, 0, sizeof(address.sin_addr));
if (bind(sockfd, (struct sockaddr *) &address, sizeof(address)))
printf("error on bind\n");
if (listen(sockfd, 5))
printf("error on listen\n");
在开始编译执行时,提示错误:"error on bind". (with #define PORT_NUMBER 502)
如果我们把它定义为2233,那么就不会有问题,如: #define PORT_NUMBER 2233
这是因为1024以下的端口都是系统保留端口,只有拥有id 0或者 CAP_NET_BIND_SERVICE 能使用它们进行通讯,
使用:RTFM capabilities(7): 后将会获得CAP_NET_BIND_SERVICE 权利。