site_archiver@lists.apple.com Delivered-To: macnetworkprog@lists.apple.com Thanks again. On Oct 4, 2005, at 4:27 PM, Josh Graessley wrote: If you look up error #13 in /usr/include/sys/errno.h, you'll see that it's: #define EACCES 13 /* Permission denied */ The number 780 is less than the mystical number 1024. <sarcasm>Clearly it's unsafe to have a process binding to a low numbered port unless it runs as root. After all, shouldn't every process listening on the network run as root at some point or another?</sarcasm> The low numbered port thing is, in my personal opinion, stupid beyond belief. -josh On Oct 4, 2005, at 4:11 PM, Ken Baer wrote: I'm trying to create a simple listening socket in my app with BSD sockets. I am unable to get bind() to work when passing it the port I want to use, 780. It does work if I set the port to 0, but that's not what I want. I made a simple C app that I built in XCode that exhibits this problem. All the sample code examples I've found (which this code comes from) are virtually identical. Is there something I should do using setsockopt() that I'm missing? The following code results in bind() failing, and errno being set to 13. #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #define MAX_BUF 100 int main(int argc, char* argv[]) { int sockd; int count; struct sockaddr_in serv_name; char buf[MAX_BUF]; int status; /* create a socket */ sockd = socket(AF_INET, SOCK_STREAM, 0); if (sockd == -1) { perror("Socket creation"); exit(1); } struct sockaddr_in my_name; /* server address */ my_name.sin_family = AF_INET; my_name.sin_addr.s_addr = INADDR_ANY; u_short port = 780; my_name.sin_port = htons(port); status = bind(sockd, (struct sockaddr*)&my_name, sizeof(my_name)); int error = errno; if (status == -1) { perror("Binding error"); exit(1); } return 0; } This email sent to jgraessley@apple.com <mailto:jgraessley@apple.com> -Ken Baer. Hash, Inc. baer@hash.com _______________________________________________ Do not post admin requests to the list. They will be ignored. Macnetworkprog mailing list (Macnetworkprog@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/macnetworkprog/site_archiver%40lists.... Wow, that fixed it! You know, I did a LOT of reading of docs and threads in this list, and did not see a mention of this limitation. The code I'm working with is ported from a Windows app that's using WinSock, which does not have this issue. It seems like this would burn a LOT of people porting from WinSock to Unix or Mac. Or, do most Windows coders also stay away from the lower port values? What you're experiencing is part of the legacy of unix. You can't bind to a port less than 1024 unless you're running as root. If you can switch to a higher numbered port, that'd be swell. It will save you other headaches. With Bonjour, you can bind to 0, the use getsockname to figure out which port you actually got, then advertise the service using Bonjour. If you really must use a low numbered port, you have a few options. You can install a setuid binary, but that gets really messy. It also leads to a number of potential security holes. MoreAuthSample has a much better example of how to solve this problem. -Ken Baer. Hash, Inc. baer@hash.com <mailto:baer@hash.com> _______________________________________________ Do not post admin requests to the list. They will be ignored. Macnetworkprog mailing list ( Macnetworkprog@lists.apple.com <mailto:Macnetworkprog@lists.apple.com> ) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/macnetworkprog/ jgraessley%40apple .com <http://lists.apple.com/mailman/options/macnetworkprog/ jgraessley%40appl e.com> This email sent to site_archiver@lists.apple.com