connectsock.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:9k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. #include "innbbsconf.h"
  2. #include "daemon.h"
  3. extern int errno;
  4. static void 
  5. reapchild(s)
  6. int     s;
  7. {
  8. int     state;
  9. while (waitpid(-1, &state, WNOHANG | WUNTRACED) > 0) {
  10. /* printf("reaping childn"); */
  11. }
  12. }
  13. void 
  14. dokill(s)
  15. int     s;
  16. {
  17. kill(0, SIGKILL);
  18. }
  19. static  INETDstart = 0;
  20. int 
  21. startfrominetd(flag)
  22. {
  23. INETDstart = flag;
  24. }
  25. int 
  26. standalonesetup(fd)
  27. int     fd;
  28. {
  29. int     on = 1;
  30. struct linger foobar;
  31. if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0)
  32. syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m");
  33. foobar.l_onoff = 0;
  34. if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &foobar, sizeof(foobar)) < 0)
  35. syslog(LOG_ERR, "setsockopt (SO_LINGER): %m");
  36. }
  37. static char *UNIX_SERVER_PATH;
  38. static int (*halt) ();
  39. sethaltfunction(haltfunc)
  40. int     (*haltfunc) ();
  41. {
  42. halt = haltfunc;
  43. }
  44. void 
  45. docompletehalt(s)
  46. int     s;
  47. {
  48. /*
  49.  * printf("try to remove %sn", UNIX_SERVER_PATH);
  50.  * unlink(UNIX_SERVER_PATH);
  51.  */
  52. exit(0);
  53. /* dokill(); */
  54. }
  55. void 
  56. doremove(s)
  57. int     s;
  58. {
  59. if (halt != NULL)
  60. (*halt) (s);
  61. else
  62. docompletehalt(s);
  63. }
  64. initunixserver(path, protocol)
  65. char   *path;
  66. char   *protocol;
  67. {
  68. struct sockaddr_un s_un;
  69. /* unix endpoint address */
  70. struct protoent *pe; /* protocol information entry */
  71. int     s;
  72. char   *ptr;
  73. bzero((char *) &s_un, sizeof(s_un));
  74. s_un.sun_family = AF_UNIX;
  75. strcpy(s_un.sun_path, path);
  76. if (protocol == NULL)
  77. protocol = "tcp";
  78. /* map protocol name to protocol number */
  79. pe = getprotobyname(protocol);
  80. if (pe == NULL) {
  81. fprintf(stderr, "%s: Unknown protocol.n", protocol);
  82. return (-1);
  83. }
  84. /* Allocate a socket */
  85. s = socket(PF_UNIX, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, 0);
  86. if (s < 0) {
  87. printf("protocol %dn", pe->p_proto);
  88. perror("socket");
  89. return -1;
  90. }
  91. /* standalonesetup(s); */
  92. signal(SIGHUP, SIG_IGN);
  93. signal(SIGUSR1, SIG_IGN);
  94. signal(SIGCHLD, reapchild);
  95. UNIX_SERVER_PATH = path;
  96. signal(SIGINT, doremove);
  97. signal(SIGTERM, doremove);
  98. chdir("/");
  99. if (bind(s, (struct sockaddr *) & s_un, sizeof(struct sockaddr_un)) < 0) {
  100. perror("bind");
  101. perror(path);
  102. return -1;
  103. }
  104. listen(s, 10);
  105. return s;
  106. }
  107. initinetserver(service, protocol)
  108. char   *service;
  109. char   *protocol;
  110. {
  111. struct servent *se; /* service information entry */
  112. struct hostent *he; /* host information entry */
  113. struct protoent *pe; /* protocol information entry */
  114. struct sockaddr_in sin; /* Internet endpoint address */
  115. int     port, s;
  116. int     randomport = 0;
  117. bzero((char *) &sin, sizeof(sin));
  118. sin.sin_family = AF_INET;
  119. if (!strcmp("0", service)) {
  120. randomport = 1;
  121. sin.sin_addr.s_addr = INADDR_ANY;
  122. }
  123. if (service == NULL)
  124. service = DEFAULTPORT;
  125. if (protocol == NULL)
  126. protocol = "tcp";
  127. /* map service name to port number */
  128. /* service ---> port */
  129. se = getservbyname(service, protocol);
  130. if (se == NULL) {
  131. port = htons((u_short) atoi(service));
  132. if (port == 0 && !randomport) {
  133. fprintf(stderr, "%s/%s: Unknown service.n", service, protocol);
  134. return (-1);
  135. }
  136. } else
  137. port = se->s_port;
  138. sin.sin_port = port;
  139. /* map protocol name to protocol number */
  140. pe = getprotobyname(protocol);
  141. if (pe == NULL) {
  142. fprintf(stderr, "%s: Unknown protocol.n", protocol);
  143. return (-1);
  144. }
  145. /* Allocate a socket */
  146. s = socket(PF_INET, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, pe->p_proto);
  147. if (s < 0) {
  148. perror("socket");
  149. return -1;
  150. }
  151. standalonesetup(s);
  152. signal(SIGHUP, SIG_IGN);
  153. signal(SIGUSR1, SIG_IGN);
  154. signal(SIGCHLD, reapchild);
  155. signal(SIGINT, dokill);
  156. signal(SIGTERM, dokill);
  157. chdir("/");
  158. if (bind(s, (struct sockaddr *) & sin, sizeof(struct sockaddr_in)) < 0) {
  159. perror("bind");
  160. return -1;
  161. }
  162. listen(s, 10);
  163. #ifdef DEBUG
  164. {
  165. int     length = sizeof(sin);
  166. getsockname(s, &sin, &length);
  167. printf("portnum alocalted %dn", sin.sin_port);
  168. }
  169. #endif
  170. return s;
  171. }
  172. int 
  173. open_unix_listen(path, protocol, initfunc)
  174. char   *path;
  175. char   *protocol;
  176. int     (*initfunc) ARG((int));
  177. {
  178. int     s;
  179. s = initunixserver(path, protocol);
  180. if (s < 0) {
  181. return -1;
  182. }
  183. if (initfunc != NULL) {
  184. printf("in inetsingleserver before initfunc s %dn", s);
  185. if ((*initfunc) (s) < 0) {
  186. perror("initfunc error");
  187. return -1;
  188. }
  189. printf("end inetsingleserver before initfunc n");
  190. }
  191. return s;
  192. }
  193. int 
  194. open_listen(service, protocol, initfunc)
  195. char   *service;
  196. char   *protocol;
  197. int     (*initfunc) ARG((int));
  198. {
  199. int     s;
  200. if (!INETDstart)
  201. s = initinetserver(service, protocol);
  202. else
  203. s = 0;
  204. if (s < 0) {
  205. return -1;
  206. }
  207. if (initfunc != NULL) {
  208. printf("in inetsingleserver before initfunc s %dn", s);
  209. if ((*initfunc) (s) < 0) {
  210. perror("initfunc error");
  211. return -1;
  212. }
  213. printf("end inetsingleserver before initfunc n");
  214. }
  215. return s;
  216. }
  217. int 
  218. inetsingleserver(service, protocol, serverfunc, initfunc)
  219. char   *service;
  220. char   *protocol;
  221. int     (*initfunc) ARG((int));
  222. int     (*serverfunc) ARG((int));
  223. {
  224. int     s;
  225. if (!INETDstart)
  226. s = initinetserver(service, protocol);
  227. else
  228. s = 0;
  229. if (s < 0) {
  230. return -1;
  231. }
  232. if (initfunc != NULL) {
  233. printf("in inetsingleserver before initfunc s %dn", s);
  234. if ((*initfunc) (s) < 0) {
  235. perror("initfunc error");
  236. return -1;
  237. }
  238. printf("end inetsingleserver before initfunc n");
  239. } {
  240. int     ns = tryaccept(s);
  241. int     result = 0;
  242. if (ns < 0 && errno != EINTR) {
  243. #ifdef DEBUGSERVER
  244. perror("accept");
  245. #endif
  246. }
  247. close(s);
  248. if (serverfunc != NULL)
  249. result = (*serverfunc) (ns);
  250. close(ns);
  251. return (result);
  252. }
  253. }
  254. int 
  255. tryaccept(s)
  256. int     s;
  257. {
  258. int     ns, fromlen;
  259. struct sockaddr sockaddr; /* Internet endpoint address */
  260. fromlen = sizeof(struct sockaddr_in);
  261. #ifdef DEBUGSERVER
  262. fputs("Listening againn", stdout);
  263. #endif
  264. do {
  265. ns = accept(s, &sockaddr, &fromlen);
  266. errno = 0;
  267. } while (ns < 0 && errno == EINTR);
  268. return ns;
  269. }
  270. int 
  271. inetserver(service, protocol, serverfunc)
  272. char   *service;
  273. char   *protocol;
  274. int     (*serverfunc) ARG((int));
  275. {
  276. int     port, s;
  277. if (!INETDstart)
  278. s = initinetserver(service, protocol);
  279. else
  280. s = 0;
  281. if (s < 0) {
  282. return -1;
  283. }
  284. for (;;) {
  285. int     ns = tryaccept(s);
  286. int     result = 0;
  287. int     pid;
  288. if (ns < 0 && errno != EINTR) {
  289. #ifdef DEBUGSERVER
  290. perror("accept");
  291. #endif
  292. continue;
  293. }
  294. #ifdef DEBUGSERVER
  295. fputs("Accept OKn", stdout);
  296. #endif
  297. pid = fork();
  298. if (pid == 0) {
  299. close(s);
  300. if (serverfunc != NULL)
  301. result = (*serverfunc) (ns);
  302. close(ns);
  303. exit(result);
  304. } else if (pid < 0) {
  305. perror("fork");
  306. return -1;
  307. }
  308. close(ns);
  309. }
  310. return 0;
  311. }
  312. int 
  313. inetclient(server, service, protocol)
  314. char   *server;
  315. char   *protocol;
  316. char   *service;
  317. {
  318. struct servent *se; /* service information entry */
  319. struct hostent *he; /* host information entry */
  320. struct protoent *pe; /* protocol information entry */
  321. struct sockaddr_in sin; /* Internet endpoint address */
  322. int     port, s;
  323. bzero((char *) &sin, sizeof(sin));
  324. sin.sin_family = AF_INET;
  325. if (service == NULL)
  326. service = DEFAULTPORT;
  327. if (protocol == NULL)
  328. protocol = "tcp";
  329. if (server == NULL)
  330. server = DEFAULTSERVER;
  331. /* map service name to port number */
  332. /* service ---> port */
  333. se = getservbyname(service, protocol);
  334. if (se == NULL) {
  335. port = htons((u_short) atoi(service));
  336. if (port == 0) {
  337. fprintf(stderr, "%s/%s: Unknown service.n", service, protocol);
  338. return (-1);
  339. }
  340. } else
  341. port = se->s_port;
  342. sin.sin_port = port;
  343. /* map server hostname to IP address, allowing for dotted decimal */
  344. he = gethostbyname(server);
  345. if (he == NULL) {
  346. sin.sin_addr.s_addr = inet_addr(server);
  347. if (sin.sin_addr.s_addr == INADDR_NONE) {
  348. fprintf(stderr, "%s: Unknown host.n", server);
  349. return (-1);
  350. }
  351. } else
  352. bcopy(he->h_addr, (char *) &sin.sin_addr, he->h_length);
  353. /* map protocol name to protocol number */
  354. pe = getprotobyname(protocol);
  355. if (pe == NULL) {
  356. fprintf(stderr, "%s: Unknown protocol.n", protocol);
  357. return (-1);
  358. }
  359. /* Allocate a socket */
  360. s = socket(PF_INET, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, pe->p_proto);
  361. if (s < 0) {
  362. perror("socket");
  363. return -1;
  364. }
  365. /* Connect the socket to the server */
  366. if (connect(s, (struct sockaddr *) & sin, sizeof(sin)) < 0) {
  367. /* perror("connect"); */
  368. return -1;
  369. }
  370. return s;
  371. }
  372. int 
  373. unixclient(path, protocol)
  374. char   *path;
  375. char   *protocol;
  376. {
  377. struct protoent *pe; /* protocol information entry */
  378. struct sockaddr_un s_un;/* unix endpoint address */
  379. int     s;
  380. bzero((char *) &s_un, sizeof(s_un));
  381. s_un.sun_family = AF_UNIX;
  382. if (path == NULL)
  383. path = DEFAULTPATH;
  384. if (protocol == NULL)
  385. protocol = "tcp";
  386. strcpy(s_un.sun_path, path);
  387. /* map protocol name to protocol number */
  388. pe = getprotobyname(protocol);
  389. if (pe == NULL) {
  390. fprintf(stderr, "%s: Unknown protocol.n", protocol);
  391. return (-1);
  392. }
  393. /* Allocate a socket */
  394. s = socket(PF_UNIX, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, 0);
  395. if (s < 0) {
  396. perror("socket");
  397. return -1;
  398. }
  399. /* Connect the socket to the server */
  400. if (connect(s, (struct sockaddr *) & s_un, sizeof(s_un)) < 0) {
  401. /* perror("connect"); */
  402. return -1;
  403. }
  404. return s;
  405. }