[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,版权归原作者所有
#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网络通信的更多相关文章
- BSD socket编程学习
1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...
- iPhone socket 编程之BSD Socket篇
iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...
- 使用BSD socket编写Windows版的网络程序
我们知道BSD Socket是标准的套接字规范,那么怎么在windows使用他们呢? 我们首先要引用<winsock2.h>和ws2_32.lib 然后,执行WSAStartup #ifd ...
- 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端
第20章 RL-TCPnet之BSD Socket客户端 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
第19章 RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- BSD Socket~TCP~Example Code
TCP 协议实现 C版本号,可用于Mac OS X机器上执行 Server: /* Setting up a simple TCP server involves the following step ...
- socket编程 ------ BSD socket API
伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...
- 伯克利套接字(BSD Socket)
http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...
随机推荐
- Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法
http://blog.csdn.net/dyllove98/article/details/8830264 如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步 ...
- Windows Server 2008安装Memcached笔记
分布式缓存系统Memcached简介与实践 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然 ...
- Solr 1.3 安装步骤
可以通过以下三种方式之一设置 Solr 的主位置: 1.设置 java 系统属性 solr.solr.home (没错,就是 solr.solr.home). 2.配置 ...
- Oracle抓取表结构的语句
oracle --------------------------------------- SELECT case when t.COLUMN_ID=1 then t.table_name en ...
- 解决IE浏览器IFrame对象内存不释放问题
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...
- html-----007
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Excel对话框大全
Excel对话框大全 序号 名称 描述 1 Application.Dialogs(1).Show 是调用打开对话框 2 Application.Dialogs(5或145).Show 是调用另存为 ...
- javascript dom编程艺术笔记之图片库的改进
dom的操作要遵守的原则 1.平稳退化 2.分离javascript 3.向后兼容 4.性能考虑 改进后的显示图片方法 function showpic(whichpic){ if(!document ...
- 08_使用TCP/IP Monitor监视SOAP协议
[SOAP定义] SOAP 简单对象访问协议,基于http传输xml数据,soap协议体是xml格式.SOAP 是一种网络通信协议SOAP 即Simple Object Access Pr ...
- 浪潮MegaCli
再总结: 一般,清RAID再做RAID,安装完毕后: ./MegaCli64 -PDList -aALL | egrep 'Slot|Enclosure Device' ...