Differences between version 11 and previous revision of NetworkProgramming.
Other diffs: Previous Major Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 11 | Last edited on Sunday, July 28, 2002 12:46:28 am | by PerryLorier | Revert |
Older page: | version 10 | Last edited on Saturday, July 27, 2002 4:38:55 pm | by PerryLorier | Revert |
@@ -102,5 +102,83 @@
}
}
close(serverfd);
+ }
+
+!!!A General Client Implementation
+* Create a socket of the correct type with socket(2)
+* connect(2) it to a correct address
+
+A simple client implementation:
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+int create_client_connection(char *hostname,char *service)
+{
+ struct addrinfo hints;
+ struct addrinfo result;
+ struct addrinfo result_iter;
+ int ret;
+ int clientfd;
+
+ hints.ai_flags=0;
+ hints.ai_family=PF_UNSPEC;
+ hints.ai_socktype=SOCK_STREAM;
+ hints.ai_protocol=0;
+ hints.ai_addrlen=0;
+ hints.ai_address=NULL;
+ hints.ai_canonname=NULL;
+
+ ret=getaddrinfo(hostname,service,&hints,&result);
+ if (ret!=0) {
+ fprintf("getaddrinfo failed: %s",gai_strerror(ret));
+ return -1;
+ }
+
+ for(result_iter = result; result ; result_iter=result_iter->next) {
+ clientfd=socket(result_iter->ai_family,result_iter->ai_socktype,result_iter->ai_protocol);
+ if (clientfd<0) {
+ perror("socket");
+ continue;
+ }
+ if (bind(clientfd,result_iter->ai_address,result_iter->ai_addrlen)<0) {
+ perror("bind");
+ close(clientfd);
+ continue;
+ }
+ break;
+ }
+
+ if (!result_iter) {
+ return -1;
+ }
+
+ return clientfd;
+ }
+
+ int main(int argc,char **argv)
+ {
+ int clientfd;
+ char buffer[65535];
+ int length;
+
+ clientfd=create_client_connection("localhost","hello");
+
+ if (clientfd<0) {
+ return 1;
+ }
+
+ len=read(clientfd,buffer,sizeof(buffer));
+
+ if (len<0) {
+ perror("read");
+ close(clientfd);
+ return 1;
+ }
+
+ /* Write it to stdout (fd1) */
+ write(1,buffer,len);
+
+ close(clientfd);
}