第一版
| #include <stdio.h> |
| #include <sys/socket.h> |
| #include <sys/types.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #include <unistd.h> |
| #include <string.h> |
| #include <stdlib.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| |
| if(argc != 2) |
| { |
| printf("请传递一个端口号\n"); |
| return -1; |
| } |
| |
| |
| int port = atoi(argv[1]); |
| if( port<1025 || port>65535 ) |
| { |
| printf("端口号范围应为1025~65535"); |
| return -1; |
| } |
| |
| |
| int socket_fd = socket(AF_INET, SOCK_STREAM, 0); |
| if(socket_fd == -1) |
| { |
| perror("创建tcp通信socket失败!\n"); |
| return -1; |
| } |
| |
| |
| struct sockaddr_in server_addr = {0}; |
| server_addr.sin_family = AF_INET; |
| server_addr.sin_port = htons(port); |
| server_addr.sin_addr.s_addr = INADDR_ANY; |
| int ret = bind(socket_fd, (struct sockaddr *) &server_addr, sizeof(server_addr) ); |
| if(ret == -1) |
| { |
| perror("bind failed!\n"); |
| return -1; |
| } |
| |
| |
| ret = listen(socket_fd, 5); |
| if(ret == -1) |
| { |
| perror("listen falied!\n"); |
| } |
| |
| |
| printf("server is running!\n"); |
| |
| struct sockaddr_in client_addr = {0}; |
| int len = sizeof(client_addr); |
| int new_socket_fd = -1; |
| |
| |
| new_socket_fd = accept( socket_fd, (struct sockaddr *)&client_addr, &len); |
| if(new_socket_fd == -1) |
| { |
| perror("accpet error!\n"); |
| } |
| else |
| { |
| printf("IP:%s, PORT:%d [connected]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); |
| } |
| |
| |
| while(1) |
| { |
| char buf[1024] = {0}; |
| read(new_socket_fd, buf, sizeof(buf)); |
| printf("receive msg:%s\n", buf); |
| if(strcmp(buf, "exit") == 0) |
| { |
| break; |
| } |
| } |
| |
| |
| close(new_socket_fd); |
| close(socket_fd); |
| |
| return 0; |
| } |
| |
第二版
| |
| |
| |
| |
| |
| |
| |
| #include <stdio.h> |
| #include <sys/socket.h> |
| #include <sys/types.h> |
| #include <stdlib.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #include <unistd.h> |
| #include <string.h> |
| |
| int initServer(const struct sockaddr_in server_addr, int type, socklen_t size, int backlog); |
| int initAccept(int server_fd); |
| |
| int main(int argc, char *argv[]) |
| { |
| int type = SOCK_STREAM; |
| |
| struct sockaddr_in server_addr = {0}; |
| server_addr.sin_family = AF_INET; |
| server_addr.sin_port = htons(8001); |
| server_addr.sin_addr.s_addr = htonl(INADDR_ANY); |
| bzero(&(server_addr.sin_zero), 8); |
| |
| socklen_t size = sizeof(server_addr); |
| |
| int backlog = 5; |
| |
| |
| |
| |
| |
| |
| |
| int server_fd = initServer(server_addr, type, size, backlog); |
| |
| int client_fd = initAccept(server_fd); |
| |
| |
| while(1) |
| { |
| char buf[1024] = {0}; |
| read(client_fd, buf, sizeof(buf)); |
| printf("receive from client msg:%s\n", buf); |
| if(strcmp(buf, "q") == 0) |
| { |
| break; |
| } |
| } |
| |
| |
| close(client_fd); |
| close(server_fd); |
| exit(EXIT_SUCCESS); |
| } |
| |
| |
| int initAccept(int server_fd) |
| { |
| struct sockaddr_in client_addr = {0}; |
| int len = sizeof(client_addr); |
| int new_socket_fd = -1; |
| |
| |
| new_socket_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len); |
| if(new_socket_fd == -1) |
| { |
| perror("accpet error!\n"); |
| } |
| else |
| { |
| |
| printf("IP:%s, PORT:%d [connected]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); |
| } |
| |
| return new_socket_fd; |
| } |
| |
| |
| int initServer(const struct sockaddr_in server_addr, int type, socklen_t size, int backlog) |
| { |
| int fd; |
| int err; |
| |
| |
| if ((fd = socket(server_addr.sin_family, type, 0)) < 0) |
| { |
| perror("Error initServer:"); |
| exit(EXIT_FAILURE); |
| } |
| else |
| { |
| printf("Create socket Success.\n"); |
| } |
| |
| |
| |
| |
| |
| |
| if (bind(fd, (struct sockaddr *) &server_addr, size) < 0) |
| { |
| perror("Error:"); |
| exit(EXIT_FAILURE); |
| } |
| else |
| { |
| printf("Bind success.\n"); |
| } |
| |
| |
| if (listen(fd, backlog) < 0) |
| { |
| perror("Error:"); |
| exit(EXIT_FAILURE); |
| } |
| else |
| { |
| printf("Listen success.\n"); |
| } |
| |
| return fd; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本