一、查看while源代码
(1)基础知识
1.TCP
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
2.嵌套字
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
(2)函数调用
1.socket
int socket(int domain, int type,int protocol)
参数 |
解释 |
用法 |
domain |
网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等) |
AF_UNIX只能够用于单一的Unix 系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程主机之间通信(当我们 man socket时发现 domain可选项是 PF_而不是AF_,因为glibc是posix的实现所以用PF代替了AF,不过我们都可以使用的). |
type |
网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等) |
SOCK_STREAM表明使用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流.SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信. |
protocol |
由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了 |
|
|
|
|
2.bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
参数 |
解释 |
sockfd |
由socket调用返回的文件描述符 |
addrlen |
sockaddr结构的长度 |
my_addr |
sockaddr结构的长度 |
3.listen
int listen(int sockfd,int backlog)
参数 |
解释 |
sockfd |
是bind后的文件描述符 |
backlog |
设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长 |
4.accept
int accept(int sockfd, struct sockaddr *addr,int *addrlen)
参数 |
解释 |
sockfd |
|
addr/addrlen |
是用来给客户端的程序填写的,服务器端只要传递指针就可以了 |
5.connect
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
参数 |
解释 |
sockfd |
socket返回的文件描述符 |
serv_addr |
储存了服务器端的连接信息.其中sin_add是服务端的地址 |
addrlen |
serv_addr的长度 |
二、编译并在ubuntu下运行
编译
gcc -o server-while-tcp.out server-while-tcp.c
gcc -o client.out client.c
运行
./server-while-tcp.out
./client.out 192.168.1.*** //新的窗口打开
三、.修改服务器为多线程模式
server(服务器端)源码
/* socket
* bind
* listen
* accept
* send/recv
*/
int charup(unsigned char ch[1000]);
int main(int argc, char **argv)
&
int iSocketServer;
int iSocketClient;
struct sockaddr_in tSocketServerAddr; /* 存放服务器端的通讯协议族、要监听的端口号等信息的结构体 */
struct sockaddr_in tSocketClientAddr; /* 存放连接的客户端的IP地址等信息的结构体 */
int iRet;
int iAddrLen;
int iRecvLen;
unsigned char ucRecvBuf[1000];
int iClientNum = -1;