113 |
114 |
114 int main (int argc, char** argv) { |
115 int main (int argc, char** argv) { |
115 int ssock, sock; |
116 int ssock, sock; |
116 struct sockaddr_in addr; |
117 struct sockaddr_in addr; |
117 socklen_t addr_len; |
118 socklen_t addr_len; |
|
119 |
|
120 // parse arguments |
|
121 int opt; |
|
122 const char *port_name = NULL; |
118 |
123 |
|
124 while ((opt = getopt(argc, argv, "l:")) != -1) { |
|
125 switch (opt) { |
|
126 case 'l': |
|
127 if (port_name) |
|
128 err_exit("only specify -l once"); |
|
129 |
|
130 port_name = optarg; |
|
131 break; |
|
132 |
|
133 default: |
|
134 err_exit("Usage: %s [-l port]", argv[0]); |
|
135 } |
|
136 } |
|
137 |
|
138 if (!port_name) |
|
139 port_name = RENDER_PORT_NAME; |
|
140 |
|
141 unsigned short port = atoi(port_name); |
|
142 |
|
143 if (!port) |
|
144 err_exit("invalid port: %s", port_name); |
119 |
145 |
120 // create the socket |
146 // create the socket |
121 if ((ssock = socket(PF_INET, SOCK_STREAM, 0)) == -1) |
147 if ((ssock = socket(PF_INET, SOCK_STREAM, 0)) == -1) |
122 perr_exit("socket"); |
148 perr_exit("socket"); |
123 |
149 |
124 addr.sin_family = AF_INET; |
150 addr.sin_family = AF_INET; |
125 addr.sin_port = htons(RENDER_PORT); |
151 addr.sin_port = htons(port); |
126 addr.sin_addr.s_addr = INADDR_ANY; |
152 addr.sin_addr.s_addr = INADDR_ANY; |
127 |
153 |
128 if (argc > 1) |
|
129 addr.sin_port = htons(atoi(argv[1])); |
|
130 |
|
131 if (bind(ssock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == -1) |
154 if (bind(ssock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == -1) |
132 perr_exit("bind"); |
155 perr_exit("bind"); |
133 |
156 |
134 if (listen(ssock, 1) == -1) |
157 if (listen(ssock, 1) == -1) |
135 perr_exit("listen"); |
158 perr_exit("listen"); |