<Beginning Linux Programming_4th>  chapter 15 Sockets

1  A simple local client/server

1)  client.c

// 1) header files
// int socket(int domain, int type, int protocol);
#include <sys/types.h>
// int connect(int socket, const struct sockaddr*address,size_t address_len);
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
/* struct sockaddr_in{
short int sin_family; // AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; //Internet address
}; */
#include <netinet/in.h>
#include <arpa/inet.h>
// size_t write(int fildes, const void *buf, size_t nbytes);
// size_t read(int fildes, const void *buf, size_t nbytes);
#include <unistd.h> // 2) socket
int main ()
{
// 127.0.0.1 loopback network
// 192.168.1.1 local area network via an Ethernet adaptor
// 158.152.x.x modem link to an Internet service provider
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch = 'A'; /* struct in_addr{
unsigned long int s_addr;
}; */
sockfd = socket(AF_INET, SOCK_STREAM, );
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons();
len = sizeof(address);
/* sizeof(变量/数据类型); // 结果是一个整数
变量或此种数据类型的变量所占的内存空间字节数
printf("the size of char is %d bytes\n", sizeof(char)); */
// 3) connect
result = connect(sockfd, (struct sockaddr*) &address, len);
if(result == -)
{
perror("oops: client");
exit();
} // 4) write, read and close
write(sockfd, &ch, );
read(sockfd, &ch, );
printf("char from server = %c\n", ch); close(sockfd);
exit();
} /* convert 16-bit/32-bit integers between host and network ordering
<netinet/in.h>
unsigned long int htol(unsigned long int hostlong);
unsigned short int htos(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

2)  server.c

// 1)  header files
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> // 2) socket
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len; struct sockaddr_in server_address;
struct sockaddr_in client_address;
unlink("server_socket"); server_sockfd = socket(AF_INET, SOCK_STREAM, );
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons();
server_len = sizeof(server_address); // 3) bind, listen
bind(server_sockfd, (struct sockaddr*)&server_address, server_len);
listen(server_sockfd, ); // 4) while loop: accept - read/write - close
while()
{
char ch;
printf("server waiting\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len); read(client_sockfd, &ch, );
ch++;
write(client_sockfd, &ch,); close(client_sockfd);
}
}
// int bind(int socket, const struct sockaddr* address, size_t address_len);
// int listen(int socket, int backlog);
// int accept(int socket, struct sockaddr* address, size_t* address_len);

2  A server for multiple clients

server2.c

// 1)  header files
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h> // 2) socket
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len; struct sockaddr_in server_address;
struct sockaddr_in client_address; server_sockfd = socket(AF_INET, SOCK_STREAM, );
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons();
server_len = sizeof(server_address); // 3) bind, listen, signal
bind(server_sockfd, (struct sockaddr*)&server_address, server_len);
listen(server_sockfd, );
signal(SIGCHLD, SIG_IGN); // 4) while loop: accept - fork
while()
{
char ch;
printf("server waiting\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len); if(fork() == )
{
read(client_sockfd, &ch, );
sleep();
ch++;
write(client_sockfd, &ch,);
close(client_sockfd);
exit();
}
else
{
close(client_sockfd);
}
}
}

3  An improved server for multiple clients

server3.c

// header files
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h> // 1) socket
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len; struct sockaddr_in server_address;
struct sockaddr_in client_address; int result;
fd_set readfds, testfds; server_sockfd = socket(AF_INET, SOCK_STREAM, );
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons();
server_len = sizeof(server_address); // 2) bind, listen
bind(server_sockfd, (struct sockaddr*)&server_address, server_len);
listen(server_sockfd, );
FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds); // 3) while loop: server activity, client activity
while()
{
char ch;
int fd;
int nread;
testfds = readfds;
printf("server waiting\n");
result = select(FD_SETSIZE, &testfds, (fd_set*), (fd_set*), (struct timeval*)); if(result<){
perror("server");
exit();
} for(fd=; fd<FD_SETSIZE; fd++)
{
if(FD_ISSET(fd, &testfds))
{
if(fd==server_sockfd)
{
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len);
FD_SET(client_sockfd, &readfds);
printf("adding client an fd %d\n", client_sockfd);
}
else
{
ioctl(fd, FIONREAD, &nread); if(nread==)
{
close(fd);
FD_CLR(fd, &readfds);
printf("removing client on fd %d\n", fd);
}
else
{
read(fd, &ch, );
sleep();
printf("serving client on fd %d\n", fd);
ch++;
write(fd, &ch, );
}
} // 1st if
} // 2nd if
} //for
} // while
} // main

小结:

client: socket -- connect --r/w -- close

server: socket -- bind -- listen -- accept -- r/w -- close

while(1)

server2: socket -- bind -- listen -- signal -- accept -- fork

while(1)

Network client/server的更多相关文章

  1. Client–server model

    Client–server model From Wikipedia, the free encyclopedia The client–server model of computing ] Oft ...

  2. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization【转】

    https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Proto ...

  3. 深入浅出 Redis client/server交互流程

    综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...

  4. AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库

    AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...

  5. Linux SocketCan client server demo hacking

    /*********************************************************************** * Linux SocketCan client se ...

  6. NetMQ(ZeroMQ)Client => Server => Client 模式的实现

    ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库.它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(m ...

  7. Java Client/Server 基础知识

    Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为: Java.net  Java.net.ftp  Java. ...

  8. DTLS协议中client/server的认证过程和密钥协商过程

    我的总结:DTLS的握手就是协商出一个对称加密的秘钥(每个客户端的秘钥都会不一样),之后的通信就要这个秘钥进行加密通信.协商的过程要么使用非对称加密算法进行签名校验身份,要么通过客户端和服务器各自存对 ...

  9. [并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]

    Pthread线程使用模型之三 客户端/服务端模型(Client/Server) 场景 1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– ...

随机推荐

  1. 树状数组---Squared Permutation

    BNUOJ   51636 最近,无聊的过河船同学在玩一种奇怪的名为“小Q的恶作剧”的纸牌游戏. 现在过河船同学手有张牌,分别写着,打乱顺序之后排成一行,位置从左往右按照标号. 接下来小Q同学会给出个 ...

  2. 常用 Git 命令清单(摘录)

    来源:阮一峰的网络日志 网址:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来 ...

  3. CentOS7.2设置zabbix

    准备工作 1.lnmp或lamp环境,本机环境:CentOS 7.2 64位,nginx1.10.2 php5.6.26 mysql5.7.15 2.软件Zabbix wget http://nchc ...

  4. Delphi又要换东家了

    前几天听到这个消息,搞个FMX出来,64位还没搞清楚,又开始折腾了!http://www.deltics.co.nz/blog/posts/2371 No Seriously – Let’s Buy ...

  5. Angularjs,WebAPI 搭建一个简易权限管理系统 —— 基本功能演示(二)

    目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 基本功能演示(二) 非常抱歉这个月实在太忙,一直 ...

  6. JavaScript调Java

    1.映射Java对象到JavaScript对象上 MainActivity.java package com.example.jsdemo; import android.os.Bundle; imp ...

  7. android:ellipsize实现跑马灯效果总结(转)

      最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...

  8. new 小记

    new运算符 能根据需求来创建对象的实例 通过与构造函数和一系列初始化过程中使用的可选参数来创建对象的实例,对象创建完成后,新创建的对象继承自构造函数的原型 function Person(name) ...

  9. mvc项目架构分享系列之架构搭建之Infrastructure

    项目架构搭建之Infrastructure的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构 ...

  10. anriod TabHost

    package com.example.yanlei.mytk; import android.os.Bundle; import android.support.v7.app.AppCompatAc ...