socket基础知识
windows环境下的基础代码:
1 // server.cpp 2 #include <stdio.h> 3 #include <winsock.h> 4 #pragma comment(lib, "ws2_32.lib") 5 6 int main() 7 { 8 // 初始化DLL 9 WSADATA wsaData; 10 WSAStartup(MAKEWORD(2, 2), &wsaData); 11 12 printf("wVersion: %d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); 13 printf("wHighVersion: %d.%d\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); 14 printf("szDescription: %s\n", wsaData.szDescription); 15 printf("szSystemStatus: %s\n", wsaData.szSystemStatus); 16 17 // 创建套接字 18 SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 19 20 // 绑定套接字 21 struct sockaddr_in sockAddr; 22 memset(&sockAddr, 0, sizeof(sockAddr)); 23 sockAddr.sin_family = PF_INET; 24 sockAddr.sin_addr.s_addr = inet_addr("192.168.182.1"); 25 sockAddr.sin_port = htons(1234); 26 bind(servSock, (SOCKADDR*)(&sockAddr), sizeof(SOCKADDR)); 27 28 // 进入监听状态 29 listen(servSock, 20); 30 31 // 接收客户端请求 32 SOCKADDR clntAddr; 33 int nSize = sizeof(SOCKADDR); 34 SOCKET clntSock = accept(servSock, (SOCKADDR*)(&clntAddr), &nSize); 35 36 // 向客户端发送数据 37 const char* str = "Hello world!"; 38 send(clntSock, str, strlen(str) + sizeof(char), NULL); 39 40 // 关闭套接字 41 closesocket(clntSock); 42 closesocket(servSock); 43 44 // 终止DLL 45 WSACleanup(); 46 47 return 0; 48 } 49 50 51 52 53 54 // clent.cpp 55 #include <stdio.h> 56 #include <stdlib.h> 57 #include <WinSock2.h> 58 59 #pragma comment(lib, "ws2_32.lib") 60 61 int main() 62 { 63 // 初始化DLL 64 WSADATA wsaData; 65 WSAStartup(MAKEWORD(2, 2), &wsaData); 66 67 printf("wVersion: %d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); 68 printf("wHighVersion: %d.%d\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); 69 printf("szDescription: %s\n", wsaData.szDescription); 70 printf("szSystemStatus: %s\n", wsaData.szSystemStatus); 71 72 // 通过域名获取ip 73 struct hostent* host = gethostbyname("www.yanzhihui.com"); 74 if (!host) { 75 printf("Failed to get ip address!"); 76 // 终止DLL 77 WSACleanup(); 78 return -1; 79 } 80 81 //别名 82 for (int i = 0; host->h_aliases[i]; i++) { 83 printf("Aliases %d: %s\n", i + 1, host->h_aliases[i]); 84 } 85 86 //地址类型 87 printf("Address type: %s\n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6"); 88 89 //IP地址 90 for (int i = 0; host->h_addr_list[i]; i++) { 91 printf("IP addr %d: %s\n", i + 1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i])); 92 } 93 94 // 创建套接字 95 SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 96 97 // 绑定套接字 98 struct sockaddr_in sockAddr; 99 memset(&sockAddr, 0, sizeof(sockAddr)); 100 sockAddr.sin_family = PF_INET; 101 sockAddr.sin_addr.s_addr = inet_addr("192.168.182.128"); 102 //sockAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)host->h_addr_list[0])); 103 sockAddr.sin_port = htons(1234); 104 connect(sock, (SOCKADDR*)(&sockAddr), sizeof(SOCKADDR)); 105 106 // 接收服务器传回的数据 107 char szBuffer[MAXBYTE] = { 0 }; 108 recv(sock, szBuffer, MAXBYTE, NULL); 109 110 printf("Message from server: %s\n", szBuffer); 111 112 // 关闭套接字 113 closesocket(sock); 114 115 // 终止DLL 116 WSACleanup(); 117 118 system("pause"); 119 120 return 0; 121 }
linux环境下的基础代码:
1 // server.cpp 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 #include <arpa/inet.h> 7 #include <sys/socket.h> 8 #include <netinet/in.h> 9 #include <netdb.h> 10 11 int main() 12 { 13 // 创建套接字 14 int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 15 16 // 通过域名获取ip 17 struct hostent *host = gethostbyname("www.yanzhihui.com"); 18 if(!host){ 19 printf("Failed to get ip address!"); 20 return -1; 21 } 22 23 // 别名 24 for(int i = 0; host->h_aliases[i]; i++){ 25 printf("Aliases %d: %s\n", i+1, host->h_aliases[i]); 26 } 27 28 // 地址类型 29 printf("Address type: %s\n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6"); 30 31 // IP地址 32 for(int i = 0; host->h_addr_list[i]; ++i) 33 { 34 printf("ip addr %d: %s\n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i])); 35 } 36 37 // 将套接字绑定到指定IP、端口 38 struct sockaddr_in serv_addr; 39 memset(&serv_addr, 0, sizeof(serv_addr)); 40 serv_addr.sin_family = AF_INET; 41 serv_addr.sin_addr.s_addr = inet_addr("192.168.182.128"); 42 //serv_addr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)host->h_addr_list[0])); 43 serv_addr.sin_port = htons(1234); 44 bind(serv_sock, (struct sockaddr*)(&serv_addr), sizeof(serv_addr)); 45 46 // 进入监听状态,等待用户发起请求 47 listen(serv_sock, 20); 48 49 // 接受客户端请求 50 struct sockaddr_in clnt_addr; 51 socklen_t clnt_addr_size = sizeof(clnt_addr); 52 int clnt_sock = accept(serv_sock, (struct sockaddr*)(&clnt_addr), &clnt_addr_size); 53 54 // 向客户端发送数据 55 char str[] = "Hello World"; 56 write(clnt_sock, str, sizeof(str)); 57 58 // 关闭套接字 59 close(clnt_sock); 60 close(serv_sock); 61 62 return 0; 63 } 64 65 66 67 68 69 70 // client.cpp 71 #include <stdio.h> 72 #include <string.h> 73 #include <stdlib.h> 74 #include <unistd.h> 75 #include <arpa/inet.h> 76 #include <sys/socket.h> 77 78 int main() 79 { 80 // 创建套接字 81 int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 82 83 // 将套接字绑定到指定IP、端口 84 struct sockaddr_in serv_addr; 85 memset(&serv_addr, 0, sizeof(serv_addr)); 86 serv_addr.sin_family = AF_INET; 87 serv_addr.sin_addr.s_addr = inet_addr("192.168.182.1"); 88 serv_addr.sin_port = htons(1234); 89 connect(sock, (struct sockaddr*)(&serv_addr), sizeof(serv_addr)); 90 91 // 读取服务器传回的消息 92 char buffer[40]; 93 read(sock, buffer, sizeof(buffer) - 1); 94 95 printf("Message from server: %s\n", buffer); 96 // 关闭套接字 97 close(sock); 98 99 return 0; 100 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步