C++中的套接字编程

Swa*_*pta 13 c++ sockets networking network-programming

任何人都可以使用C++中的套接字向我提供有关客户端和服务器连接的示例示例.我现在已经完成了一些教程,我想实现它.怎么开始?

cod*_*ict 22

您可以在此处找到有效的客户端 - 服务器程序:Beej的网络编程指南

  • 此答案中的链接不再起作用。 (2认同)

Ton*_*roy 7

C++标准中没有套接字API.POSIX C API是相当可移植的(GNU libC文档提供了UDP和TCP客户端和服务器的示例,当我将另一台服务器划分到一起时,我通常会将其转向),或者您可以使用Boost.ASIO库获得更多C++体验....


小智 6

我用 C/C++ 编写了一个简单的客户端/服务器示例,没有任何额外的功能。您可以参考此示例构建自己的用例。原始代码附在此处,并且也在github中开源!。

\n

客户

\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}\n
Run Code Online (Sandbox Code Playgroud)\n

服务器

\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}\n
Run Code Online (Sandbox Code Playgroud)\n