#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封装,旨在简化开发过程,提高代码的可读性和可维护性。以下是对这个开源项目的详细解析: 首先,Socket是TCP/IP协议族的基本组成...
综上所述,TCPNetKit是一个集成了服务器和客户端功能的Socket封装库,提供了方便的数据交互机制。它简化了网络编程的复杂性,让开发者更专注于业务逻辑,而不是底层的网络通信细节。在实际项目中,开发者可以根据...
iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)iOS socket 封装(oc)v
在本项目"socket封装"中,我们关注的是几个关键的网络编程问题:断线重连、心跳上报以及粘包处理。 首先,让我们详细探讨断线重连机制。在网络通信中,由于各种原因(如网络不稳定、服务器故障等),连接可能会中断...
在"Node.js-Nodesocket封装和优化Kalm"这个主题中,我们主要探讨的是如何在Node.js环境中封装和优化socket通信。 Socket是网络通信的基础,它提供了进程间通信(IPC)或网络间通信的能力。在Node.js中,我们可以...
"Go-veryveryvery轻量级的socket封装不粘包心跳检测并发安全"这个项目,显然旨在提供一个高效、易用且适用于并发环境的socket库。下面将详细解析这个项目的几个关键特性。 首先,"轻量级的socket封装"意味着这个库...
总结,"vc socket封装类通讯,服务器和客户端源程序"这个主题主要涉及到的是使用CAsyncSocket在VC++环境中实现网络通信的基本步骤和方法。通过理解并实践这些知识点,开发者可以构建出稳定、高效的网络应用,支持多...
开源项目"SimpleSocket"提供了一个简洁易用的Socket封装类,为开发者提供了更便捷的方式来处理网络通信。本文将深入解析这个开源库,探讨其设计理念、主要功能以及如何在实际开发中应用。 首先,让我们理解什么是...
标题“socket封装dll”指的是这种将Socket功能打包到DLL文件的做法。 DLL(Dynamic Link Library)是一种共享库机制,它允许多个应用程序同时使用同一段代码,减少了内存占用并提高了执行效率。在本例中,"jio....
《网络类库_socket封装类库详解》 网络通信在信息技术领域扮演着至关重要的角色,而Socket作为网络编程的基础,是连接两端通信的关键。本文将深入探讨一个高度封装的Socket类库,它允许开发者直接点对点传输“对象...
标题中的“跨平台socket封装”指的是在不同的操作系统上(如Windows、Linux、macOS等)实现网络通信的接口标准化,以便编写的应用程序可以在多种平台上运行。Socket是操作系统提供的一种网络编程接口,它允许应用...
标题“Class-Socket.zip_c++ Socket类_socket_socket class_socket封装_socket”以及描述“visual C++ 编程,封装好的Socket类,可用于广播”暗示了一个关于C++中Socket类的封装,特别是针对广播功能的应用。...
"socket_api.rar_DEMO_socket_socket封装"这个资源提供了一个关于如何封装socket的示例,以简化socket编程过程。下面将详细讲解socket的基本概念、封装的必要性以及压缩包中包含的文件及其作用。 首先,socket是...
本资源“C# Socket封装类和组件源码”提供了一种简化C#中Socket操作的方法,特别适合初学者进行学习和实践。 首先,让我们了解Socket的基本概念。Socket是进程间通信(IPC)的一种方式,特别是在网络环境下。它允许...
这个压缩包文件包含了该软件设计过程中的核心资源,包括封装库、原理图库、PCB封装库以及芯片测试SOCKET封装库,这些都是进行高效、准确的硬件项目设计所必不可少的部分。 1. **封装库**:在电路设计中,封装是指元...
使用IOCP完成端口和SOCKET封装的异步TCP类。 支持客户端和服务器的常用TCP接口:绑定Bind、监听Listen、接收Recv、连接Conn、发送Send、关闭Close。所有接口均使用异步回调的方式处理,内部实现使用Windows下性能...
使用vc,对socket进行了类封装,同时采用多线程处理的方式。对于初学者和使用者有很好的借鉴价值。