TCP:
服务端基本流程:
socket --> bind --> listen --> accept --> send/recv --> close
void server_tcp() { //服务端 int n; char buf[20]; sockaddr_in addr; socklen_t len(sizeof(addr)); addr.sin_family = AF_INET; // inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr); addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(6666); memset(&addr.sin_zero[0], 0, 8); int sockfd = socket(AF_INET, SOCK_STREAM, 0); print("sockfd:", sockfd); int client_fd; char client_ip[20]; if (bind(sockfd, (struct sockaddr *) &addr, len) == -1) { print("bind error"); goto errloop; } if (listen(sockfd, 5) == -1) { print("listen error"); goto errloop; } if ((client_fd = accept(sockfd, (struct sockaddr *) &addr, &len)) == -1) { print("listen error"); goto errloop; } inet_ntop(AF_INET, &addr.sin_addr, client_ip, 20); print("client_fd:", client_fd); print("client_ip:", client_ip); int sendbytes; while (n = read(STDIN_FILENO, buf, 10)) { if ((sendbytes = send(client_fd, buf, n, 0)) == -1) { print("send error"); } if(buf[0] == 'q'){ break; } } errloop: close(sockfd); }
客户端:
socket --> connect --> send/recv --> close
void client_tcp(){ int n, bufsize(1024); char buf[bufsize]; sockaddr_in addr; socklen_t len(sizeof(addr)); addr.sin_family = AF_INET; inet_pton(AF_INET, "192.168.191.3", &addr.sin_addr.s_addr); addr.sin_port = htons(6666); memset(&addr.sin_zero[0], 0, 8); int sockfd = socket(AF_INET, SOCK_STREAM, 0); print("sonsockfd:", sockfd); fflush(stdout); if(connect(sockfd, (struct sockaddr *)&addr, len) == -1){ print("connect error"); return; } print("Link ok"); fflush(stdout); while(n = recv(sockfd, buf, bufsize, 0)){ buf[n] = 0; if(buf[0] == 'q') break; print(buf); fflush(stdout); } close(sockfd); }
UDP:
服务端:
socket --> bind(有无影响不大) --> sendto/recvfrom
void server_udp(){ int socketfd; sockaddr_in addr = {0}; sockaddr sockp; socketfd = socket(AF_INET, SOCK_DGRAM, 0); int n; char buf[10]; sockaddr_in client_addr = {0}; client_addr.sin_family = AF_INET; // inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr.s_addr); client_addr.sin_addr.s_addr = INADDR_ANY; client_addr.sin_port = htons(6667); socklen_t len = sizeof(client_addr); while (n = read(STDIN_FILENO, buf, 10)) { if (sendto(socketfd, buf, n, 0, (sockaddr *)&client_addr, len) == -1) { //client_addr中有目标地址,不需要bind print("send error"); }else{ print("send ok"); } if(buf[0] == 'q'){ break; } } close(socketfd); }
客户端:
socket --> bind --> sendto/recvfrom
void client_udp(){ int n, bufsize(1024); char buf[bufsize]; sockaddr_in ser_addr = {0}; socklen_t len(sizeof(ser_addr)); ser_addr.sin_family = AF_INET; // inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr); ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); ser_addr.sin_port = htons(6667); // memset(&addr.sin_zero[0], 0, 8); int sockfd = socket(AF_INET, SOCK_DGRAM, 0); bind(sockfd, (sockaddr *)&ser_addr, len); //要确定从哪接收或发送数据 print("sonsockfd:", sockfd); fflush(stdout); while(n = recvfrom(sockfd, buf, 10, 0, (sockaddr *)&ser_addr, &len)){ buf[n] = 0; if(buf[0] == 'q') break; print(buf); fflush(stdout); } close(sockfd); }