<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. 泛函编程(23)-泛函数据类型-Monad

    简单来说:Monad就是泛函编程中最概括通用的数据模型(高阶数据类型).它不但涵盖了所有基础类型(primitive types)的泛函行为及操作,而且任何高阶类或者自定义类一旦具备Monad特性就可 ...

  2. 欧拉计划之题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}

    本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/10-9a--b--c--1000a-b-c #include <std ...

  3. R语言学习笔记:因子

    R语言中的因子就是factor,用来表示分类变量(categorical variables),这类变量不能用来计算而只能用来分类或者计数. 可以排序的因子称为有序因子(ordered factor) ...

  4. (方法调配)Method Swizzling

    一.概念 方法调配:因为Objective-C是运行时语言,也就是说究竟会调用何种方法要在运行期才能解析出来.那么我们其实也可以在运行时改变选择子名称.这样我们既不需要查看到源代码,又没有必要去重写子 ...

  5. 《慕客网:IOS-动画入门》学习笔记

    新建Cocoa Touch Class,语言是swift 然后继续为界面添加一个普通的View Controller,并且添加前面视图的静态table的转向剪头指向这个View Controller, ...

  6. Windows 编 程中的字符串

    (1)在win32编程中,如何使用string类型 #include <string> using namespace std; LPTSTR    lpCmdLine = L" ...

  7. android textview 设置text 字体

    1.使用不同的字库 mLocalClock.setTypeface(Typeface.SANS_SERIF); Typeface face = Typeface.createFromAsset(get ...

  8. 在阿里云主机的Debian操作系统上安装Docker

    因为需要新搭建饭团网站,所以需要在阿里云的主机上跑数据库,java环境. 考虑到可扩展性和模块化,所以准备最近流行的docker技术.Docker -- 从入门到实践 阿里云主机1核1G,资源不多,所 ...

  9. Effective Java 28 Use bounded wildcards to increase API flexibility

    Get and Put Principle PECS stands for producer-extends(? extends T), consumer-super(? super T). For ...

  10. JavaScript Patterns 2.8 Number Conversions with parseInt()

    Strings that start with 0 are treated as octal numbers (base 8) in ECMAScript 3; however, this has c ...