湖南响应式网站建设,wap网站建设公司,建设网站需要两种服务支持,阿里企业邮箱登陆入口1--TCP/IP协议栈 TCP/IP协议栈共分 4 层#xff0c;可以理解为数据收发分成了 4 个层次化过程#xff1b; 链路层#xff1a; 链路层是物理链接领域标准化的结果#xff0c;专门定义LAN、WAN、MAN等网络标准#xff1b; IP层#xff1a; IP层用于解决数据传输过程中路径的…1--TCP/IP协议栈 TCP/IP协议栈共分 4 层可以理解为数据收发分成了 4 个层次化过程 链路层 链路层是物理链接领域标准化的结果专门定义LAN、WAN、MAN等网络标准 IP层 IP层用于解决数据传输过程中路径的选择问题 TCP/IP层 即传输层用于解决数据传输的问题数据顺序、可靠性等 应用层 程序员根据数据传输规则编写规定的程序例如Socket来实现数据传输 2--TCP服务器端默认函数调用顺序 一般 TCP 服务器端调用默认函数的顺序如下socket() 创建 Socket → bind() 分配Socket 地址 → listen() 等待连接请求状态 → accept() 允许连接 → read()/write() 数据交换 → close() 断开连接 调用 listen() 函数进入等待连接请求状态只有服务器端调用了 listen() 函数客户端才能进入可发出连接请求的状态 #include sys/socket.hint listen(int sock, int backlog); // 成功时返回 0, 失败时返回 -1;// sock 表示希望进入等待连接请求状态的Socket的文件描述符
// backlog 表示连接请求等待队列的长度即最多可以使多少个连接请求进入队列 服务器端调用 accept() 函数来受理客户端的连接请求即受理等待队列中待处理的客户端连接请求 #include sys/socket.hint accept(int sock, struct sockaddr* addr, socklen_t* addrlen);
// 成功时返回创建的Socket的文件描述符失败时返回-1
3--TCP客户端的默认函数调用顺序 一般 TCP 客户端调用默认函数的顺序如下socket() 创建 Socket → connect() 请求连接 → read()/write() 交换数据 → close() 断开连接 在服务器端调用 listen() 函数创建连接请求等待队列后客户端可通过调用 connect() 函数来请求连接 #include sys/socket.hint connect(int sock, struct sockaddr* servaddr, socklen_t addrlen);// sock 表示客户端socket的文件描述符
// servaddr 保存了目标服务器端地址信息
// addrlen 第二个结构体参数 servaddr 的地址变量长度以字节为单位
4--Linux实现迭代回声服务器端/客户端
服务器端
// gcc echo_server.c -o echo_server
// ./echo_server 9190#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include arpa/inet.h
#include sys/socket.h#define BUF_SIZE 1024
void error_handling(char *message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){int serv_sock, clnt_sock;char message[BUF_SIZE];int str_len, i;struct sockaddr_in serv_adr, clnt_adr;socklen_t clnt_adr_sz;if(argc ! 2){printf(Usage : %s port\n, argv[0]);exit(1);}serv_sock socket(PF_INET, SOCK_STREAM, 0);if(serv_sock -1){error_handling(socket() error);}memset(serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family AF_INET;serv_adr.sin_addr.s_addr htonl(INADDR_ANY);serv_adr.sin_port htons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*)serv_adr, sizeof(serv_adr)) -1){error_handling(bind() error);}if(listen(serv_sock, 5) -1){error_handling(listen() error);}clnt_adr_sz sizeof(clnt_adr);for(i 0; i 5; i){clnt_sock accept(serv_sock, (struct sockaddr*)clnt_adr, clnt_adr_sz);if(clnt_sock -1){error_handling(accept() error);}else{printf(Connected client %d \n, i1);}while((str_len read(clnt_sock, message, BUF_SIZE)) ! 0){write(clnt_sock, message, str_len);}close(clnt_sock);}close(serv_sock);return 0;
}
客户端
// gcc echo_client.c -o echo_client
// ./echo_client 127.0.0.1 9190#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include arpa/inet.h
#include sys/socket.h#define BUF_SIZE 1024void error_handling(char *message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){int sock;char message[BUF_SIZE];int str_len;struct sockaddr_in serv_adr;if(argc ! 3){printf(Usage : %s IP port\n, argv[0]);exit(1);}sock socket(PF_INET, SOCK_STREAM, 0);if(sock -1){error_handling(socket() error);}memset(serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family AF_INET;serv_adr.sin_addr.s_addr inet_addr(argv[1]);serv_adr.sin_port htons(atoi(argv[2]));if(connect(sock, (struct sockaddr*)serv_adr, sizeof(serv_adr)) -1){error_handling(connect() error!);}else{puts(Connected.......);}while(1){fputs(Input message(Q to quit): , stdout);fgets(message, BUF_SIZE, stdin);if(!strcmp(message, q\n) || !strcmp(message, Q\n)){break;}write(sock, message, strlen(message));str_len read(sock, message, BUF_SIZE-1);message[str_len] 0;printf(Message from server: %s, message);}close(sock);return 0;
}
运行结果 5--Windows实现迭代回声服务器端/客户端
服务器端
// gcc echo_server_win.c -o echo_server_win -lwsock32
// echo_server_win 9190#include stdio.h
#include stdlib.h
#include string.h
#include winsock2.h#define BUF_SIZE 1024void ErrorHandling(char *message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;SOCKET hServSock, hClntSock;char message[BUF_SIZE];int strLen, i;SOCKADDR_IN servAdr, clntAdr;int clntAdrSize;if(argc ! 2){printf(Usage : %s port\n, argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2, 2), wsaData) ! 0){ErrorHandling(WSAStartup() error!);}hServSock socket(PF_INET, SOCK_STREAM, 0);if(hServSock INVALID_SOCKET){ErrorHandling(socket() error);}memset(servAdr, 0, sizeof(servAdr));servAdr.sin_family AF_INET;servAdr.sin_addr.s_addr htonl(INADDR_ANY);servAdr.sin_port htons(atoi(argv[1]));if(bind(hServSock, (SOCKADDR*)servAdr, sizeof(servAdr)) SOCKET_ERROR){ErrorHandling(bind() error);}if(listen(hServSock, 5) SOCKET_ERROR){ErrorHandling(listen() error);}clntAdrSize sizeof(clntAdr);for(int i 0; i 5; i){hClntSock accept(hServSock, (SOCKADDR*)clntAdr, clntAdrSize);if(hClntSock -1){ErrorHandling(accept() error);}else{printf(Connected client %d \n, i 1);}while((strLen recv(hClntSock, message, BUF_SIZE, 0)) ! 0){send(hClntSock, message, strLen, 0);}closesocket(hClntSock);}closesocket(hServSock);WSACleanup();return 0;
}
客户端
// gcc echo_client_win.c -o echo_client_win -lwsock32
// echo_client_win 127.0.0.1 9190#include stdio.h
#include stdlib.h
#include string.h
#include winsock2.h#define BUF_SIZE 1024void ErrorHandling(char *message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;SOCKET hSocket;char message[BUF_SIZE];int strLen;SOCKADDR_IN servAdr;if(argc ! 3){printf(Usage: %s IP port\n, argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2, 2), wsaData) ! 0){ErrorHandling(WSAStartup() error!);}hSocket socket(PF_INET, SOCK_STREAM, 0);if(hSocket INVALID_SOCKET){ErrorHandling(socket() error);}memset(servAdr, 0, sizeof(servAdr));servAdr.sin_family AF_INET;servAdr.sin_addr.s_addr inet_addr(argv[1]);servAdr.sin_port htons(atoi(argv[2]));if(connect(hSocket, (SOCKADDR*)servAdr, sizeof(servAdr)) SOCKET_ERROR){ErrorHandling(connect() error!);}else{puts(Connected........);}while(1){fputs(Input message(Q to quit): , stdout);fgets(message, BUF_SIZE, stdin);if(!strcmp(message, q\n) || !strcmp(message, Q\n)){break;}send(hSocket, message, strlen(message), 0);strLen recv(hSocket, message, BUF_SIZE - 1, 0);message[strLen] 0;printf(Message from server: %s, message);}closesocket(hSocket);WSACleanup();return 0;
}
测试结果