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,版权归原作者所有

 #import <UIKit/UIKit.h>

 #define MYPORT 4880
#import <stdio.h>
#import <stdlib.h>
#import <unistd.h>
#import <arpa/inet.h>
#import <sys/types.h>
#import <sys/socket.h>
#import <netdb.h> @interface BSDHttpExampleViewController : UIViewController {
int sockfd;
struct sockaddr_in their_addr;
} @end

BSDHttpExampleViewController.h

 #import "BSDHttpExampleViewController.h"

 @interface BSDHttpExampleViewController()
@end @implementation BSDHttpExampleViewController #define HTTPMETHOD @"GET"
#define HTTPVERSION @"HTTP/1.1"
#define HTTPHOST @"Host" //#define KENTER @"/r/n"
#define KENTER @"\r\n\n"
#define KBLANK @" " /*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
*/ /*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/ void error_handle(char *errorMsg)
{
fputs(errorMsg, stderr);
fputc('\n',stderr);
exit();
} - (NSMutableString*) makeHttpHeader:(NSString*) hostName
{
NSMutableString *header = [[NSMutableString alloc] init]; [header appendFormat:HTTPMETHOD];
[header appendFormat:KBLANK];
[header appendFormat:@"/index.html"];
[header appendFormat:KBLANK];
[header appendFormat:HTTPVERSION];
[header appendFormat:KENTER];
[header appendFormat:HTTPHOST];
[header appendFormat:@":"];
//[header appendFormat:hostName];
[header appendString:hostName];
[header appendFormat:KENTER];
[header appendFormat:KENTER]; NSLog(@"header is %@",header); return header;
} - (NSString*)getIpAddressForHost:(NSString*) theHost
{
struct hostent *host = gethostbyname([theHost UTF8String]); if(!host)
{
herror("resolv");
return NULL;
} struct in_addr **list = (struct in_addr **)host->h_addr_list;
NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[]) encoding:NSASCIIStringEncoding];
//= [NSString stringWithCString:inet_ntoa(*list[0])];
return addressString;
} - (void)Connect:(NSString *)hostName content:(NSString *)contentSended
{
if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -)
{
perror("socket");
exit();
} //NSHost *host = [NSHost hostWithName:hostName]; //if(host)
//{
their_addr.sin_family = AF_INET; //their_addr.sin_addr.s_addr = inet_addr([[host address] UTF8String]);
their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);
NSLog(@"getIpAddressForHost :%@",[self getIpAddressForHost:hostName]); their_addr.sin_port = htons();
bzero(&(their_addr.sin_zero), ); int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)); NSLog(@"Connect errno is :%d",conn);
if(conn != -)
{
NSLog(@"Then the conn is not -1!"); NSMutableString* httpContent = [self makeHttpHeader:hostName]; NSLog(@"httpCotent is :%@",httpContent); if(contentSended != nil)
//[httpContent appendFormat:contentSended];
[httpContent appendString:contentSended]; NSLog(@"Sended content is :%@",httpContent); NSData *data = [httpContent dataUsingEncoding:NSISOLatin1StringEncoding];
ssize_t dataSended = send(sockfd, [data bytes], [data length], ); if(dataSended == [data length])
{
NSLog(@"Datas have been sended over!");
}
//printf("send %d bytes to %s\n",dataSended,inet_ntoa(their_addr.sin_addr)); printf("send %zd bytes to %s\n",dataSended,inet_ntoa(their_addr.sin_addr)); NSMutableString* readString = [[NSMutableString alloc] init];
char readBuffer[]; int br = ;
NSLog(@"size of %li",sizeof(readBuffer));
while((br = recv(sockfd, readBuffer, sizeof(readBuffer), )) < sizeof(readBuffer))
{
NSLog(@"read datas length is :%d",br); // [readString appendFormat:[NSString stringWithCString:readBuffer length:br]];
[readString appendString:[NSString stringWithCString:readBuffer encoding:kCFStringEncodingUTF8]]; NSLog(@"Hava received datas is :%@",readString);
} close(sockfd);
}else {
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];
[alert show];
//[alert release];
} /*
}
else
{
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];
[alert show];
[alert release];
}
**/
} - (void)Send:(id)sender
{
char message[] = "aaag";
send(sockfd,message,sizeof(message),);
NSLog(@"%s",message);
} // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[self Connect:@"www.baidu.com" content:nil]; [super viewDidLoad]; NSLog(@"view has been loaded!");
} /*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/ - (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use.
} - (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
} @end

BSDHttpExampleViewController.m

[Socket]BSD Socket网络通信的更多相关文章

  1. BSD socket编程学习

    1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...

  2. iPhone socket 编程之BSD Socket篇

    iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...

  3. 使用BSD socket编写Windows版的网络程序

    我们知道BSD Socket是标准的套接字规范,那么怎么在windows使用他们呢? 我们首先要引用<winsock2.h>和ws2_32.lib 然后,执行WSAStartup #ifd ...

  4. 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端

    第20章      RL-TCPnet之BSD Socket客户端 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  5. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器

    第19章      RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  6. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  7. BSD Socket~TCP~Example Code

    TCP 协议实现 C版本号,可用于Mac OS X机器上执行 Server: /* Setting up a simple TCP server involves the following step ...

  8. socket编程 ------ BSD socket API

    伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...

  9. 伯克利套接字(BSD Socket)

    http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...

随机推荐

  1. 编码、解码Html代码

    引用 Base64-80.js 文件 做网页的时候有时候需要把富文本框的html代码保存到数据库,那么就需要编码后保存到数据库.浏览器端或后台再解码作绑定 *编码:encode64(str) *解码: ...

  2. Android----二维码开发

    Android----二维码开发 本文为原创,转载请注明出处:http://www.cnblogs.com/xiaobaicai12138/p/5644244.html 一.工具 谷歌的zxing 不 ...

  3. spring boot 配置文件提示自定义配置属性

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. OC与Swift的区别二(常量、变量、运算符)

    4.常量与变量声明 oc的变量声明使用  类型 变量名 = 变量值的方式,其中类型为系统内置数据类型或自定义类型,变量名需由英文字母开头且不能包含特殊字符 swift变量声明使用 var 变量名 = ...

  5. webapi之jsonp调用

    定义跨域handle public class CorsHandler : DelegatingHandler { const string Origin = "Origin"; ...

  6. java.util.HashMap源码分析

    在java jdk8中对HashMap的源码进行了优化,在jdk7中,HashMap处理“碰撞”的时候,都是采用链表来存储,当碰撞的结点很多时,查询时间是O(n). 在jdk8中,HashMap处理“ ...

  7. MYSQL命令cmd操作

    今天我们就来看一下数据库的各种命令,以下命令全部是从CMD命令窗口下的命令行输入指令,首先如果如果输入mysql,系统提示“mysql不是内部命 令或外部命令.那么这其实是环境变量没有设置好的原因,例 ...

  8. MySQL存储引擎,优化,事务

    1唯一约束unique和主键key的区别?     1.什么是数据的存储引擎?       存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...

  9. jQuery EasyUI tree中state属性慎用

    EasyUI 1.4.4 tree控件中,如果是叶子节点,切忌把state设置为closed,否则该节点会加载整个tree,形成死循环 例如: json入下: [ { "checked&qu ...

  10. [C#]『PLINQ』任务并行库使用小计

    并行 LINQ (PLINQ) 是 LINQ to Objects 的并行实现. PLINQ 实现完整的 LINQ 标准查询运算符集作为 T:System.Linq 命名空间的扩展方法,并具有用于并行 ...