`
liufei.fir
  • 浏览: 685907 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

socket的封装

阅读更多
#ifndef _SOCKET_LINK_H_
#define _SOCKET_LINK_H_

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

#define MAX_PORT_INT 0
#define MAX_LINK_NUM_INT 5

typedef int SOCKET;

int client_init( SOCKET *client_sockfd, char *ip_str, int port_int );
int client_close(SOCKET *client_sockfd);
int server_init( SOCKET *server_sockfd, const int port_int ); // init socket of server
int server_accept(SOCKET *server_sockfd, SOCKET *client_sockfd, struct sockaddr_in *client_addr);
int server_close(SOCKET *server_sockfd); // close socket of server
int SendData( SOCKET sockfd, const char *send_data, int len ); // send data
int RecvData( SOCKET sockfd, char *recv_data, int len  ); // recv data

#endif //_SOCKET_LINK_H_
#include "socket_link.h"

int client_init( SOCKET *client_sockfd, char *ip_str, int port_int )
{
        if( strlen(ip_str) < 8 || port_int < MAX_PORT_INT ) {
                printf("parameter error.\n");
                return -1;
        }

        struct sockaddr_in server_addr;

        // socket
        if( (*client_sockfd = socket( AF_INET, SOCK_STREAM, 0 )) == -1 )
        {
                printf("Error: create socket! (error code:%d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        // addr
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons( port_int );
        server_addr.sin_addr.s_addr=inet_addr(ip_str);
        bzero( &(server_addr.sin_zero), 8 );

        // connect
        if( connect( *client_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr) ) == -1 )
        {
                printf("Error: connect! (error code:%d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        return 0;
}

int client_close(SOCKET *client_sockfd)
{
        if( close( *client_sockfd ) == -1 )
        {
                printf("Error: close socket! (error code:%d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        return 0;
}

int server_init( SOCKET *server_sockfd, const int port_int )
{
        struct sockaddr_in server_addr;
        int val = 1;

        if( port_int < MAX_PORT_INT )
                return -1;

        // socket
        if( (*server_sockfd = socket( AF_INET, SOCK_STREAM, 0 )) == -1 )
        {
                printf( "Error: create socket! (error code: %d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        // addr
        setsockopt(*server_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof (val));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons( port_int );
        server_addr.sin_addr.s_addr = INADDR_ANY;
        bzero( &(server_addr.sin_zero), 8 );

        // bind
        if( bind( *server_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1 )
        {
                printf( "Error: bind! (error code: %d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        // listen
        if( listen( *server_sockfd, MAX_LINK_NUM_INT ) == -1 )
        {
                printf("Error: listen! (error code:%d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        return 0;
}

int server_accept(SOCKET *server_sockfd, SOCKET *client_sockfd, struct sockaddr_in *client_addr)
{
        socklen_t sin_size = sizeof(struct sockaddr_in);

        *client_sockfd = accept( *server_sockfd, (struct sockaddr *)client_addr, &sin_size );
        if( *client_sockfd < 0 && errno == EAGAIN )
        {
             return -2;
        }

        if (*client_sockfd < 0)
        {
            return -1;
        }

        return *client_sockfd;
}

int server_close(SOCKET *server_sockfd)
{
        if( close( *server_sockfd ) == -1 )
        {
                printf("Error: close socket! (error code:%d - %s)\n", errno, strerror(errno) );
                return -1;
        }

        return 0;
}

int SendData( SOCKET sockfd, const char *send_data, int len )
{
        int ret;

        if( len <= 0 )
        {
            return -1;
        }


        do
        {
            ret = send(sockfd, send_data, len, MSG_NOSIGNAL );
        }while(ret<0 && errno == EINTR);

        if (ret < 0 && errno == EAGAIN)
        {
            return -2;
        }

        if( ret < 0 )
        {
            return -1;
        }

        return ret;
}

int RecvData( SOCKET sockfd, char *recv_data, int len  )
{
        if( !recv_data )
        {
                return -1;
        }

        int recvbytes;

        // recv
        recvbytes = recv( sockfd, recv_data, len, MSG_NOSIGNAL );
        if( recvbytes < 0 && errno == EAGAIN )
        {
            return -2;
        }

        if(recvbytes <= 0)
        {
            return -1;
        }

        return recvbytes;
}


  


  
分享到:
评论

相关推荐

    C# socket封装类和组件含例程全部开源

    本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码的可读性和可维护性。以下是对这个开源项目的详细解析: 首先,Socket是TCP/IP协议族的基本组成...

    socket封装库,有服务器和客户端

    综上所述,TCPNetKit是一个集成了服务器和客户端功能的Socket封装库,提供了方便的数据交互机制。它简化了网络编程的复杂性,让开发者更专注于业务逻辑,而不是底层的网络通信细节。在实际项目中,开发者可以根据...

    iOS socket 封装(oc)

    iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)v

    socket封装

    在本项目"socket封装"中,我们关注的是几个关键的网络编程问题:断线重连、心跳上报以及粘包处理。 首先,让我们详细探讨断线重连机制。在网络通信中,由于各种原因(如网络不稳定、服务器故障等),连接可能会中断...

    Node.js-Nodesocket封装和优化Kalm

    在"Node.js-Nodesocket封装和优化Kalm"这个主题中,我们主要探讨的是如何在Node.js环境中封装和优化socket通信。 Socket是网络通信的基础,它提供了进程间通信(IPC)或网络间通信的能力。在Node.js中,我们可以...

    Go-veryveryvery轻量级的socket封装不粘包心跳检测并发安全

    "Go-veryveryvery轻量级的socket封装不粘包心跳检测并发安全"这个项目,显然旨在提供一个高效、易用且适用于并发环境的socket库。下面将详细解析这个项目的几个关键特性。 首先,"轻量级的socket封装"意味着这个库...

    vc socket封装类通讯,服务器和客户端源程序

    总结,"vc socket封装类通讯,服务器和客户端源程序"这个主题主要涉及到的是使用CAsyncSocket在VC++环境中实现网络通信的基本步骤和方法。通过理解并实践这些知识点,开发者可以构建出稳定、高效的网络应用,支持多...

    开源socket封装类SimpleSocket

    开源项目"SimpleSocket"提供了一个简洁易用的Socket封装类,为开发者提供了更便捷的方式来处理网络通信。本文将深入解析这个开源库,探讨其设计理念、主要功能以及如何在实际开发中应用。 首先,让我们理解什么是...

    socket封装dll

    标题“socket封装dll”指的是这种将Socket功能打包到DLL文件的做法。 DLL(Dynamic Link Library)是一种共享库机制,它允许多个应用程序同时使用同一段代码,减少了内存占用并提高了执行效率。在本例中,"jio....

    网络类库_socket封装类库

    《网络类库_socket封装类库详解》 网络通信在信息技术领域扮演着至关重要的角色,而Socket作为网络编程的基础,是连接两端通信的关键。本文将深入探讨一个高度封装的Socket类库,它允许开发者直接点对点传输“对象...

    跨平台socket封装

    标题中的“跨平台socket封装”指的是在不同的操作系统上(如Windows、Linux、macOS等)实现网络通信的接口标准化,以便编写的应用程序可以在多种平台上运行。Socket是操作系统提供的一种网络编程接口,它允许应用...

    Class-Socket.zip_c++ Socket类_socket_socket class_socket封装_socket

    标题“Class-Socket.zip_c++ Socket类_socket_socket class_socket封装_socket”以及描述“visual C++ 编程,封装好的Socket类,可用于广播”暗示了一个关于C++中Socket类的封装,特别是针对广播功能的应用。...

    socket_api.rar_DEMO_socket_socket封装

    "socket_api.rar_DEMO_socket_socket封装"这个资源提供了一个关于如何封装socket的示例,以简化socket编程过程。下面将详细讲解socket的基本概念、封装的必要性以及压缩包中包含的文件及其作用。 首先,socket是...

    C# Socket封装类和组件源码

    本资源“C# Socket封装类和组件源码”提供了一种简化C#中Socket操作的方法,特别适合初学者进行学习和实践。 首先,让我们了解Socket的基本概念。Socket是进程间通信(IPC)的一种方式,特别是在网络环境下。它允许...

    Protel99se封装库 原理图库 PCB封装库 元器件库 芯片测试SOCKET封装库 (多年工作积累).rar

    这个压缩包文件包含了该软件设计过程中的核心资源,包括封装库、原理图库、PCB封装库以及芯片测试SOCKET封装库,这些都是进行高效、准确的硬件项目设计所必不可少的部分。 1. **封装库**:在电路设计中,封装是指元...

    使用IOCP完成端口和SOCKET封装的成熟异步TCP类

    使用IOCP完成端口和SOCKET封装的异步TCP类。 支持客户端和服务器的常用TCP接口:绑定Bind、监听Listen、接收Recv、连接Conn、发送Send、关闭Close。所有接口均使用异步回调的方式处理,内部实现使用Windows下性能...

    vc socket封装类,多线程处理

    使用vc,对socket进行了类封装,同时采用多线程处理的方式。对于初学者和使用者有很好的借鉴价值。

Global site tag (gtag.js) - Google Analytics