[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 ...
随机推荐
- Css3炫酷总结使用
先从CSS3的选择器说起: E F:所有的子孙元素: E>F: E中的子元素: E+F:E元素之后的最近的选择器: E~F:E中所以后面兄弟元素(CSS3 不包括自己本身,前面也不包括) att ...
- js高程 第 4章 变量、作用域和内存问题 【笔记】
4.4 小结 JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下 5 种基本数据类型:Undefined.Null.Boolean.Number 和 Str ...
- ACM——进制转换
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1012 进制转换 时间限制(普通/Jav ...
- Java分布式缓存框架
http://developer.51cto.com/art/201411/457423.htm 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓 ...
- DLL中导出STL模板类的问题
接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...
- DBCP的配置参数
tomcatde DHCP的配置 <Resource driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver&quo ...
- jQuery的基础语法实例
jQuery 基础语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(sele ...
- Invalid SOAP message or SOAP version mismatch
在把过车数据上传到海康平台的时候返回: Invalid SOAP message or SOAP version mismatch 网上找了说是协议问题,但是不知道如何解决: 我用客户端是c#2.0; ...
- UVA 10739 String to Palindrome(动态规划 回文)
String to Palindrome 题目大意:给出一个字符串s,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数.比如abccda,可以用删除操作,删除b ...
- MySQL主从同步原理 部署【转】
一.主从的作用:1.可以当做一种备份方式2.用来实现读写分离,缓解一个数据库的压力二.MySQL主从备份原理master 上提供binlog ,slave 通过 I/O线程从 master拿取 bin ...