[Socket]BSD Socket网络通信

http://blog.csdn.net/dongfengsun/article/details/4802925

文章有一些错误

#define KENTER @"/r/n"

应该为

#define KENTER @"\r\n\n"

 另外原文中的buffer设置太小,只有512,地址设置为百度的话会因为太小读不到信息,改成1024即可

 char readBuffer[512];

改成 char readBuffer[1024];

修改后日志输出:read datas length is :559

PS:改成google会达到令人发指的973.。。。~~

read datas length is :973

改了一些error和warning,版权归原作者所有

 1 #import <UIKit/UIKit.h>
 2 
 3 #define MYPORT 4880
 4 #import <stdio.h>
 5 #import <stdlib.h>
 6 #import <unistd.h>
 7 #import <arpa/inet.h>
 8 #import <sys/types.h>
 9 #import <sys/socket.h>
10 #import <netdb.h>
11 
12 @interface BSDHttpExampleViewController : UIViewController {
13     int sockfd;
14     struct sockaddr_in their_addr;
15 }
16 
17 @end
BSDHttpExampleViewController.h
  1 #import "BSDHttpExampleViewController.h"
  2 
  3 @interface BSDHttpExampleViewController()
  4 @end
  5 
  6 @implementation BSDHttpExampleViewController
  7 
  8 #define HTTPMETHOD @"GET"
  9 #define HTTPVERSION @"HTTP/1.1"
 10 #define HTTPHOST @"Host"
 11 
 12 //#define KENTER @"/r/n"
 13 #define KENTER @"\r\n\n"
 14 #define KBLANK @" "
 15 
 16 /*
 17  // The designated initializer. Override to perform setup that is required before the view is loaded.
 18  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
 19  if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
 20  // Custom initialization
 21  }
 22  return self;
 23  }
 24  */
 25 
 26 /*
 27  // Implement loadView to create a view hierarchy programmatically, without using a nib.
 28  - (void)loadView {
 29  }
 30  */
 31 
 32 
 33 void error_handle(char *errorMsg)
 34 {
 35     fputs(errorMsg, stderr);
 36     fputc('\n',stderr);
 37     exit(1);
 38 }
 39 
 40 
 41 - (NSMutableString*) makeHttpHeader:(NSString*) hostName
 42 {
 43     NSMutableString *header = [[NSMutableString alloc] init];
 44     
 45     [header appendFormat:HTTPMETHOD];
 46     [header appendFormat:KBLANK];
 47     [header appendFormat:@"/index.html"];
 48     [header appendFormat:KBLANK];
 49     [header appendFormat:HTTPVERSION];
 50     [header appendFormat:KENTER];
 51     [header appendFormat:HTTPHOST];
 52     [header appendFormat:@":"];
 53     //[header appendFormat:hostName];
 54     [header appendString:hostName];
 55     [header appendFormat:KENTER];
 56     [header appendFormat:KENTER];
 57     
 58     NSLog(@"header is %@",header);
 59     
 60     return header;
 61 }
 62 
 63 - (NSString*)getIpAddressForHost:(NSString*) theHost
 64 {
 65     struct hostent *host = gethostbyname([theHost UTF8String]);
 66     
 67     if(!host)
 68     {
 69         herror("resolv");
 70         return NULL;
 71     }
 72     
 73     struct in_addr **list = (struct in_addr **)host->h_addr_list;
 74     NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSASCIIStringEncoding];
 75     //= [NSString stringWithCString:inet_ntoa(*list[0])];
 76     return addressString;
 77 }
 78 
 79 - (void)Connect:(NSString *)hostName content:(NSString *)contentSended
 80 {
 81     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 82     {
 83         perror("socket");
 84         exit(1);
 85     }
 86     
 87     //NSHost *host = [NSHost hostWithName:hostName];
 88     
 89     //if(host)
 90     //{
 91     their_addr.sin_family = AF_INET;
 92     
 93     //their_addr.sin_addr.s_addr = inet_addr([[host address] UTF8String]);
 94     their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);
 95     NSLog(@"getIpAddressForHost :%@",[self getIpAddressForHost:hostName]);
 96     
 97     their_addr.sin_port = htons(80);
 98     bzero(&(their_addr.sin_zero), 8);
 99     
100     int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));
101     
102     NSLog(@"Connect errno is :%d",conn);
103     if(conn != -1)
104     {
105         NSLog(@"Then the conn is not -1!");
106         
107         NSMutableString* httpContent = [self makeHttpHeader:hostName];
108         
109         NSLog(@"httpCotent is :%@",httpContent);
110         
111         if(contentSended != nil)
112             //[httpContent appendFormat:contentSended];
113             [httpContent appendString:contentSended];
114         
115         NSLog(@"Sended content is :%@",httpContent);
116         
117         NSData *data = [httpContent dataUsingEncoding:NSISOLatin1StringEncoding];
118         ssize_t dataSended = send(sockfd, [data bytes], [data length], 0);
119         
120         if(dataSended == [data length])
121         {
122             NSLog(@"Datas have been sended over!");
123         }
124         //printf("send %d bytes to %s\n",dataSended,inet_ntoa(their_addr.sin_addr));
125         
126         printf("send %zd bytes to %s\n",dataSended,inet_ntoa(their_addr.sin_addr));
127         
128         NSMutableString* readString = [[NSMutableString alloc] init];
129         char readBuffer[1024];
130         
131         int br = 0;
132         NSLog(@"size of %li",sizeof(readBuffer));
133         while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)) < sizeof(readBuffer))
134         {
135             NSLog(@"read datas length is :%d",br);
136             
137            // [readString appendFormat:[NSString stringWithCString:readBuffer length:br]];
138             [readString appendString:[NSString stringWithCString:readBuffer encoding:kCFStringEncodingUTF8]];
139             
140             NSLog(@"Hava received datas is :%@",readString);
141         }
142         
143         close(sockfd);
144     }else {
145         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Connection failed to host " stringByAppendingString:hostName] message:@"Please check the hostname in the preferences." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
146         [alert show];
147         //[alert release];
148     }
149     
150     /*
151      }
152      else
153      {
154      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Could not look up host " stringByAppendingString:hostName] message:@"Please check the hostname in the preferences." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
155      [alert show];
156      [alert release];
157      }
158      **/
159 }
160 
161 - (void)Send:(id)sender
162 {
163     char message[7] = "aaag";
164     send(sockfd,message,sizeof(message),0);
165     NSLog(@"%s",message);
166 }
167 
168 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
169 - (void)viewDidLoad {
170     [self Connect:@"www.baidu.com" content:nil];
171     
172     [super viewDidLoad];
173     
174     NSLog(@"view has been loaded!");
175 }
176 
177 
178 /*
179  // Override to allow orientations other than the default portrait orientation.
180  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
181  // Return YES for supported orientations
182  return (interfaceOrientation == UIInterfaceOrientationPortrait);
183  }
184  */
185 
186 - (void)didReceiveMemoryWarning {
187     // Releases the view if it doesn't have a superview.
188     [super didReceiveMemoryWarning];
189     
190     // Release any cached data, images, etc that aren't in use.
191 }
192 
193 - (void)viewDidUnload {
194     // Release any retained subviews of the main view.
195     // e.g. self.myOutlet = nil;
196 }
197 
198 
199 
200 @end
BSDHttpExampleViewController.m

 

 

posted @ 2013-09-17 15:57  CreeperChange  阅读(432)  评论(0编辑  收藏  举报