本文来源于:Linux下的socket演示程序
http://c.biancheng.net/view/2128.html
服务端代码(发送数据)
void testSocketSendData(){
//创建套接字
int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/*
socket() 函数确定了套接字的各种属性
AF_INET 代表 ipv4, ipv6 是 AF_INET6
SOCK_STREAM 代表面向连接的套接字
IPPROTO_TCP 表示使用 TCP 协议;udp 是 IPPROTO_UDP;
*/
//将套接字和IP、端口绑定
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 绑定,IP 地址和端口都保存在 sockaddr_in 结构体中
/*
进入被动监听状态,等待用户发起请求
套接字一直处于“睡眠”中,直到客户端发起请求才会被“唤醒”
*/
listen(serv_sock, 20);
//接收客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
NSLog(@"-- wait to send");
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
// 正常情况下,程序运行到 accept() 函数就会被阻塞,等待客户端发起请求。
//向客户端发送数据
char str[] = "http://c.biancheng.net/socket/";
write(clnt_sock, str, sizeof(str)); // IO 操作
NSLog(@"-- did send and close");
//关闭套接字(和普通文件一样,socket 在使用完毕后也要用 close() 关闭)
close(clnt_sock);
close(serv_sock);
}
客户端代码(接收数据)
void testSocketRecieveData(){
//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
/*
通过 connect() 向服务器发起请求,服务器的IP地址和端口号保存在 sockaddr_in 结构体中。
直到服务器传回数据后,connect() 才运行结束。
*/
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//读取服务器传回的数据
char buffer[40];
read(sock, buffer, sizeof(buffer)-1); // 通过 read() 从套接字文件中读取数据。
printf("Message form server: %s\n", buffer);
//关闭套接字
close(sock);
}