基于TCP的server和client编写。

xiaoxiao2021-02-28  114

首先看一下大家都了解c/s架构。

先讲解server的搭建:

创建TCP套接字:

设置基础信息为后面的bind()铺垫:

bind():

监听:

等待连接:

接收和发送:

client:客户端步骤就少很多了。

创建TCP套接字:

基本信息和连接:

发送和接收:

下面是源代码:

server:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { unsigned short port = 8000; if(argc > 1) { port = atoi(argv[1]); } int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("sockfd"); exit(-1); } struct sockaddr_in my_addr;//本地信息 bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = AF_INET;//设置地址族为IPv4 my_addr.sin_port = htons(port);//设置地址的端口号信息 my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY服务器可以接收任意地址 int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)); if(err_log != 0) { perror("binding"); close(sockfd); exit(-1); } err_log = listen(sockfd, 10); if(err_log != 0) { perror("listen"); close(sockfd); exit(-1); } printf("listen client %d\n",port); struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = " "; socklen_t client_len = sizeof(client_addr); int connfd; connfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);//等待连接 if(connfd < 0 ) { perror("accept"); return -1; //continue; } inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);//转换并打印信息 printf("********************************\n"); while(1) { char recv_buf[2048] = " "; recv(connfd, recv_buf, sizeof(recv_buf), 0);//接收信息 printf("recv data:%s\n",recv_buf); send(connfd, "ok", 2, 0);//向客户端发送数据 printf("ok\n"); } close(sockfd);//关闭监听套接字 return 0; }

client:

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { unsigned short port = 8000; char *server_ip = "192.168.0.111"; if(argc > 1) { server_ip = argv[1]; } if(argc > 2) { port = atoi(argv[2]); } int sockfd = 0; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket "); exit(-1); } struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(err_log != 0) { perror("connect"); close(sockfd); exit(-1); } while(1) { char send_buf[512] = " "; char recv_buf[512] = " "; printf("send data to %s:%d\n",server_ip, port); printf("send:"); fgets(send_buf, sizeof(send_buf), stdin); send_buf[strlen(send_buf)-1] = 0; send(sockfd, send_buf, strlen(send_buf), 0);//向服务器发送数据 printf("send:%s\n",send_buf); recv(sockfd, recv_buf, sizeof(recv_buf), 0);//接收数据 printf("recv:%s\n",recv_buf); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-44634.html

最新回复(0)