sockaddr_in实例--连接server

本文详细介绍了使用socket函数实现客户端连接server的过程,包括创建套接字、设置地址信息、进行连接操作等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 要点:sockaddr_in
 * 功能:连接server
 * 成功:返回新生成的套接字文件描述符 
 * 失败:返回-1 
 */
int std_connect_socket(char *ip, char *port)
{
    int sockfd = 0, portnum = 0;
    struct sockaddr_in serv_addr;

    portnum = atoi ((const s8*)port);
    sockfd = socket (AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0)
    {
        DEBUG_PRINT("socket failed!(%s)\n", strerror(error));
        return ERROR_FAILED;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr ((const s8*)ip);
    serv_addr.sin_port = htons (portnum);

    if(connect(sockfd, (void *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        DEBUG_PRINT("connect failed! %s\n", strerror(error));
        close(sockfd);
        return ERROR_FAILED;
    }

    return sockfd;
}

``` #include <sys/socket.h> #include <netinet/in.h> #include <pthread.h> // 全局状态变量 static int s_iExit = 0; static int s_listen_fd = -1; static pthread_t s_server_thread; // 线程处理函数 static void* ServerThreadFun(void* arg) { struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); while(!s_iExit) { int client_fd = accept(s_listen_fd, (struct sockaddr*)&client_addr, &addr_len); if(client_fd < 0) { if(s_iExit) break; // 主动退出时的正常错误 continue; // 其他错误继续重试 } // 这里处理客户端连接(可新建线程处理) // handle_client(client_fd); } return NULL; } // 创建TCP服务器 int TCPServer_Create(void) { int iRet = -1; struct sockaddr_in server_addr; // 创建Socket if((s_listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); goto _Exit; } // 设置地址重用 int opt = 1; setsockopt(s_listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8080); if(bind(s_listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); goto _Exit; } // 开始监听 if(listen(s_listen_fd, 5) < 0) { perror("listen"); goto _Exit; } // 创建服务线程 if(pthread_create(&s_server_thread, NULL, ServerThreadFun, NULL) != 0) { perror("pthread_create"); goto _Exit; } iRet = 0; _Exit: if(iRet != 0 && s_listen_fd != -1) { close(s_listen_fd); s_listen_fd = -1; } return iRet; } // 销毁TCP服务器 int TCPServer_Destroy(void) { int iRet = -1; s_iExit = 1; // 设置退出标志 // 关闭监听socket会唤醒阻塞的accept if(s_listen_fd != -1) { close(s_listen_fd); s_listen_fd = -1; } // 等待线程退出 if(s_server_thread != -1) { pthread_join(s_server_thread, NULL); } iRet = 0; return iRet; }```修改代码,不使用全局变量
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值