相关链接:

http://my.oschina.net/u/1378445/blog/340206?p=2&temp=1469158886336#blog-comments-list

http://blog.csdn.net/kesalin/article/details/8798039

http://blog.csdn.net/xa846213981/article/details/50998316

服务器端:

#import <Foundation/Foundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//
int err;
//int socket(int addressFamily, int type,int protocol)
//int close(int socketFileDescriptor)
//socket 创建并初始化 socket,返回该 socket 的文件描述符,如果描述符为 -1 表示创建失败。
//通常参数 addressFamily 是 IPv4(AF_INET) 或 IPv6(AF_INET6)。type 表示 socket 的类型,通常是流stream(SOCK_STREAM) 或数据报文datagram(SOCK_DGRAM)。protocol 参数通常设置为0,以便让系统自动为选择我们合适的协议,对于 stream socket 来说会是 TCP 协议(IPPROTO_TCP),而对于 datagram来说会是 UDP 协议(IPPROTO_UDP)。
//close 关闭 socket。
int fd=socket(AF_INET, SOCK_STREAM , );
BOOL success=(fd!=-);
// 1
//
if (success) {
NSLog(@"socket success");
//Socket address, internet style.
struct sockaddr_in addr;
/*
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
*/
memset(&addr, , sizeof(addr));
addr.sin_len=sizeof(addr);
addr.sin_family=AF_INET;
// =======================================================================
addr.sin_port=htons();
// ============================================================================
addr.sin_addr.s_addr=INADDR_ANY;
//int bind(int socketFileDescriptor,sockaddr *addressToBind,int addressStructLength)
// 将 socket 与特定主机地址与端口号绑定,成功绑定返回0,失败返回 -1。
//成功绑定之后,根据协议(TCP/UDP)的不同,我们可以对 socket 进行不同的操作:
//UDP:因为 UDP 是无连接的,绑定之后就可以利用 UDP socket 传送数据了。
//TCP:而 TCP 是需要建立端到端连接的,为了建立 TCP 连接服务器必须调用 listen(int socketFileDescriptor, int backlogSize) 来设置服务器的缓冲区队列以接收客户端的连接请求,backlogSize 表示客户端连接请求缓冲区队列的大小。当调用 listen 设置之后,服务器等待客户端请求,然后调用下面的 accept 来接受客户端的连接请求。
err=bind(fd, (const struct sockaddr *)&addr, sizeof(addr));
success=(err==);
}
// 2
// ============================================================================
if (success) {
NSLog(@"bind(绑定) success");
//TCP 是需要建立端到端连接的,为了建立 TCP 连接服务器必须调用 listen(int socketFileDescriptor, int backlogSize) 来设置服务器的缓冲区队列以接收客户端的连接请求,backlogSize 表示客户端连接请求缓冲区队列的大小
err=listen(fd, );//开始监听
success=(err==);
}
// ============================================================================
//
if (success) {
NSLog(@"listen success");
// while (true) {//进入循环
struct sockaddr_in clientAddress;
int peerfd;
socklen_t addrLen;
addrLen=sizeof(clientAddress);
NSLog(@"prepare accept");
//int accept(int socketFileDescriptor,sockaddr *clientAddress, int clientAddressStructLength)
//接受客户端连接请求并将客户端的网络地址信息保存到 clientAddress 中。
//当客户端连接请求被服务器接受之后,客户端和服务器之间的链路就建立好了,两者就可以通信了。
peerfd=accept(fd, (struct sockaddr *)&clientAddress, &addrLen);
success=(peerfd!=-);
// ============================================================================
if (success) {
NSLog(@"accept success,remote address:%s,port:%d",inet_ntoa(clientAddress.sin_addr),ntohs(clientAddress.sin_port));
char buf[];
ssize_t count;
size_t len=sizeof(buf); do {
//收
NSLog(@"begin");
//int receive(int socketFileDescriptor,char *buffer, int bufferLength, int flags)
// 从 socket 中读取数据,读取成功返回成功读取的字节数,否则返回 -1。
//一旦连接建立好之后,就可以通过 send/receive 接口发送或接收数据了。注意调用 connect 设置了默认网络地址的 UDP socket 也可以调用该接口来发送数据。
count=recv(peerfd, buf, len, );
NSLog(@"end");
NSString* str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//发
char bufsend[];
printf("input message:");
scanf("%s",bufsend);
//int send(int socketFileDescriptor, char *buffer, int bufferLength, int flags)
// 通过 socket 发送数据,发送成功返回成功发送的字节数,否则返回 -1。
//一旦连接建立好之后,就可以通过 send/receive 接口发送或接收数据了。注意调用 connect 设置了默认网络地址的 UDP socket 也可以调用该接口来接收数据。
send(peerfd, bufsend, , );
} while (strcmp(buf, "exit")!=);
}
// ============================================================================
close(peerfd);
}
// }
//
}
return ;
}
//int sendto(int socketFileDescriptor,char *buffer, int bufferLength, int flags, sockaddr *destinationAddress, int destinationAddressLength)
// 通过UDP socket 发送数据到特定的网络地址,发送成功返回成功发送的字节数,否则返回 -1。
//由于 UDP 可以向多个网络地址发送数据,所以可以指定特定网络地址,以向其发送数据。 //int recvfrom(int socketFileDescriptor,char *buffer, int bufferLength, int flags, sockaddr *fromAddress, int *fromAddressLength)
// 从UDP socket 中读取数据,并保存发送者的网络地址信息,读取成功返回成功读取的字节数,否则返回 -1 。
//由于 UDP 可以接收来自多个网络地址的数据,所以需要提供额外的参数,以保存该数据的发送者身份。

客户端:

//  kewai_SocketClient
//
#import <Foundation/Foundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#import <arpa/inet.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//
int err;
//socket 创建并初始化 socket,返回该 socket 的文件描述符,如果描述符为 -1 表示创建失败。
int fd=socket(AF_INET, SOCK_STREAM, );
BOOL success=(fd!=-);
struct sockaddr_in addr;
// 1
//
if (success) {
NSLog(@"socket success");
memset(&addr, , sizeof(addr));
addr.sin_len=sizeof(addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
err=bind(fd, (const struct sockaddr *)&addr, sizeof(addr));
success=(err==);
}
// 2
//
if (success) {
//============================================================================
struct sockaddr_in peeraddr;
memset(&peeraddr, , sizeof(peeraddr));
peeraddr.sin_len=sizeof(peeraddr);
peeraddr.sin_family=AF_INET;
peeraddr.sin_port=htons();
// peeraddr.sin_addr.s_addr=INADDR_ANY;
peeraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
// 这个地址是服务器的地址,
socklen_t addrLen;
addrLen =sizeof(peeraddr);
NSLog(@"connecting");
//int connect(int socketFileDescriptor,sockaddr *serverAddress, int serverAddressLength)
// 客户端向特定网络地址的服务器发送连接请求,连接成功返回0,失败返回 -1。
//当服务器建立好之后,客户端通过调用该接口向服务器发起建立连接请求。对于 UDP 来说,该接口是可选的,如果调用了该接口,表明设置了该 UDP socket 默认的网络地址。对 TCP socket来说这就是传说中三次握手建立连接发生的地方。
//注意:该接口调用会阻塞当前线程,直到服务器返回。
err=connect(fd, (struct sockaddr *)&peeraddr, addrLen);
success=(err==);
if (success) {
// struct sockaddr_in addr;
err =getsockname(fd, (struct sockaddr *)&addr, &addrLen);
success=(err==);
//============================================================================
//============================================================================
if (success) {
NSLog(@"connect success,local address:%s,port:%d",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
char buf[];
ssize_t count;
do {
//发
printf("input message:");
scanf("%s",buf);
send(fd, buf, , ); //收
NSLog(@"begin");
count=recv(fd, buf, , );
NSLog(@"end");
NSString* str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
NSLog(@"*****%@",str); } while (strcmp(buf, "exit")!=);
}
}
else{
NSLog(@"connect failed");
}
}
// ============================================================================
//
}
return ;
}

socket(一)的更多相关文章

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

  10. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

随机推荐

  1. 【iCore3 双核心板_FPGA】例程十一:乘法器实验——乘法器使用

    实验指导书及代码包下载: http://pan.baidu.com/s/1dEijBs1 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. windows7系统下一些常用工具的总结

    1.查看计算机的基本信息:计算机--右键--属性(快捷键:Win+Pause) 2.查看计算机的详细信息:开始菜单--所有程序--附件--系统工具--系统信息(运行命令:msinfo32) 3.定制计 ...

  3. Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算

    Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = ...

  4. python(1)

    1.适配中文 #coding-utf-8 #coding: utf-8 2.格式化输出,此时的转义字符不能用\,只能用% print 'growth rate : %d \%' % 7 5 3 Tru ...

  5. python中raw_input输入数字问题

    如果按照下面方式,则无论你输入什么,都会打印12,因为raw_input接受的输入是按照字符串处理的 num = raw_input('please enter a num:') if num > ...

  6. zepto源码--核心方法5(文本操作)--学习笔记

    涉及到文本内容的主要有三个函数:html, text, val. 我们已经见过多次,一个函数多种用途的情况,今天这三个函数也不例外,既可以获取内容,也可以设置内容.判断条件就是有没有传入参数,如果没有 ...

  7. PythonDay02

    >三目运算符 简单的if---else---语句 result = 1234 if 1 > 2 else 4321 print(result) >集合 set集合,是一个无序且不重复 ...

  8. C++中的explicit关键字

    http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html 上面链接中的博主写的很好,我也不多说了.举得例子也很好,应该也是看了E ...

  9. IDEA14下多jdk编译时,enum不支持;多个project共用在一个workplace下每个module时引用外部包

    idea多个工程如何在一个项目中管理: 把多个多个项目放在一个叫work目录下,那么打开IntelliJ IDEA编译器,点击菜单 File->Open...,选择刚刚的work目录,即可. 在 ...

  10. Java之美[从菜鸟到高手演变]之Spring源码学习 - 环境搭建

    准备工作 1.下载安装STS(Spring Tool Suite),在eclipse market里直接搜索.下载.安装.2.下载安装gradle, Spring源码使用gradle构建,下载后解压到 ...