Swa*_*pta 13 c++ sockets networking network-programming
任何人都可以使用C++中的套接字向我提供有关客户端和服务器连接的示例示例.我现在已经完成了一些教程,我想实现它.怎么开始?
C++标准中没有套接字API.POSIX C API是相当可移植的(GNU libC文档提供了UDP和TCP客户端和服务器的示例,当我将另一台服务器划分到一起时,我通常会将其转向),或者您可以使用Boost.ASIO库获得更多C++体验....
小智 6
我用 C/C++ 编写了一个简单的客户端/服务器示例,没有任何额外的功能。您可以参考此示例构建自己的用例。原始代码附在此处,并且也在github中开源!。
\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <stdio.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <unistd.h>\n#include <string.h>\n#include <stdlib.h>\n\nint main(int argc, char **argv) {\n struct sockaddr_in server_addr; // set server addr and port\n memset(&server_addr, 0, sizeof(server_addr));\n server_addr.sin_family = AF_INET;\n server_addr.sin_addr.s_addr = inet_addr(argv[1]);\n server_addr.sin_port = htons(8000); // server default port\n\n int sock_client;\n char send_buf[65536];\n memset(send_buf, \'\\0\', sizeof(send_buf));\n char *send_content = "I am client";\n strcpy(send_buf, send_content);\n\n if ((sock_client = socket(AF_INET,SOCK_STREAM, 0)) < 0) {\n return 0;\n }\n\n //connect server, return 0 with success, return -1 with error\n if (connect(sock_client, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)\n {\n perror("connect");\n return 0;\n }\n\n char server_ip[INET_ADDRSTRLEN]="";\n inet_ntop(AF_INET, &server_addr.sin_addr, server_ip, INET_ADDRSTRLEN);\n printf("connected server(%s:%d). \\n", server_ip, ntohs(server_addr.sin_port));\n\n //send a message to server\n send(sock_client, send_buf, strlen(send_buf), 0);\n close(sock_client);\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <unistd.h> // for close\n#include <string.h>\n\n\nint main(int argc, char *argv[]) {\n\n int server_sockfd; // server socket fd \n struct sockaddr_in server_addr; // server info struct\n server_addr.sin_family=AF_INET; // TCP/IP\n server_addr.sin_addr.s_addr=INADDR_ANY; // server addr--permit all connection\n server_addr.sin_port=htons(8000); // server port\n\n /*\xe5\x88\x9b\xe5\xbb\xba\xe6\x9c\x8d\xe5\x8a\xa1\xe5\x99\xa8\xe7\xab\xaf\xe5\xa5\x97\xe6\x8e\xa5\xe5\xad\x97--IPv4\xe5\x8d\x8f\xe8\xae\xae\xef\xbc\x8c\xe9\x9d\xa2\xe5\x90\x91\xe8\xbf\x9e\xe6\x8e\xa5\xe9\x80\x9a\xe4\xbf\xa1\xef\xbc\x8cTCP\xe5\x8d\x8f\xe8\xae\xae*/\n /* create socket fd with IPv4 and TCP protocal*/\n if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { \n perror("socket error");\n return 1;\n }\n\n /*\xe5\xb0\x86\xe5\xa5\x97\xe6\x8e\xa5\xe5\xad\x97\xe7\xbb\x91\xe5\xae\x9a\xe5\x88\xb0\xe6\x9c\x8d\xe5\x8a\xa1\xe5\x99\xa8\xe7\x9a\x84\xe7\xbd\x91\xe7\xbb\x9c\xe5\x9c\xb0\xe5\x9d\x80\xe4\xb8\x8a*/\n /* bind socket with server addr */\n if(bind(server_sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))<0) {\n perror("bind error");\n return 1;\n }\n\n\n /*\xe7\x9b\x91\xe5\x90\xac\xe8\xbf\x9e\xe6\x8e\xa5\xe8\xaf\xb7\xe6\xb1\x82--\xe7\x9b\x91\xe5\x90\xac\xe9\x98\x9f\xe5\x88\x97\xe9\x95\xbf\xe5\xba\xa6\xe4\xb8\xba20*/\n /* listen connection request with a queue length of 20 */\n if(listen(server_sockfd,20)<0) {\n perror("listen error");\n return 1;\n }\n printf("listen success.\\n");\n\n char recv_buf[65536];\n memset(recv_buf, \'\\0\', sizeof(recv_buf));\n\n while (1) {\n struct sockaddr_in client_addr;\n socklen_t length = sizeof(client_addr);\n //\xe8\xbf\x9b\xe7\xa8\x8b\xe9\x98\xbb\xe5\xa1\x9e\xe5\x9c\xa8accept\xe4\xb8\x8a\xef\xbc\x8c\xe6\x88\x90\xe5\x8a\x9f\xe8\xbf\x94\xe5\x9b\x9e\xe9\x9d\x9e\xe8\xb4\x9f\xe6\x8f\x8f\xe8\xbf\xb0\xe5\xad\x97\xef\xbc\x8c\xe5\x87\xba\xe9\x94\x99\xe8\xbf\x94\xe5\x9b\x9e-1\n // block on accept until positive fd or error\n int conn = accept(server_sockfd, (struct sockaddr*)&client_addr,&length);\n if(conn<0) {\n perror("connect");\n return -1;\n }\n\n printf("new client accepted.\\n");\n\n char client_ip[INET_ADDRSTRLEN] = "";\n inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN);\n\n while(recv(conn, recv_buf, sizeof(recv_buf), 0) > 0 ){\n printf("recv %s from client(%s:%d). \\n", recv_buf, client_ip, ntohs(client_addr.sin_port));\n memset(recv_buf, \'\\0\', strlen(recv_buf));\n break;\n }\n }\n\n printf("closed. \\n");\n close(server_sockfd);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n