- if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
- perror_msg_and_die("connect");
+ if (lport != 0) {
+ memset(&address.sin_addr, 0, sizeof(address.sin_addr));
+ address.sin_port = htons(lport);
+
+ if (bind(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
+ perror_msg_and_die("bind");
+ }
+
+ if (do_listen) {
+ if (listen(sfd, 1) < 0)
+ perror_msg_and_die("listen");
+
+ if ((tmpfd = accept(sfd, (struct sockaddr *) &address, &opt)) < 0)
+ perror_msg_and_die("accept");
+
+ close(sfd);
+ sfd = tmpfd;
+ } else {
+ if ((hostinfo = gethostbyname(argv[optind])) == NULL)
+ error_msg_and_die("cannot resolve %s\n", argv[optind]);
+
+ address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
+ address.sin_port = htons(atoi(argv[optind+1]));
+
+ if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
+ perror_msg_and_die("connect");
+ }