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;
}
[code="C"][/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值