Penguin
Diff: NetworkProgramming
EditPageHistoryDiffInfoLikePages

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);