linux c socket 封装,刚封装的,用于屏蔽windows和linux差异的socket库函数,大家给点意见,谢谢...

/*******************************************************************************

*

* File Name: u_socket.c -- lib of socket fuctions

* Copyright:

* Author : *** ***

* Date : 2010-07-01

* History :

* Mender : *** ***

* Date : 2010-07-01

* Content: create

*

*******************************************************************************/

#include "u_def.h"

#include

#if (U_OS == OS_WIN32)

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

#elif (U_OS == OS_LINUX)

#include

#include

#include

#include

#include

#include

#include

#include

#endif

#include "u_socket.h"

#include "log.h"

//static BOOL g_bEnableIpv6 = FALSE;/***************************************************************************/

/***************************************************************************

* @function initialize the win-sock library

* @return success:0 ; fail:1

***************************************************************************/

UINT32 SOCKET_Init(void)

{

#if (U_OS == OS_WIN32)

INT32 iRet = FALSE;

WSADATA wsaData;

if ((iRet = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)

{

printf("WSAStartup() failed with error code %d\n", WSAGetLastError());

}

return (UINT32)iRet;

#elif (U_OS == OS_LINUX)

return U_OK;

#endif

}

/***************************************************************************

* @function create a new socket

* @param

* type IPPROTO_UDP stand for UDP,IPPROTO_TCP for TCP

* @return success:the socket fd; fail:0

***************************************************************************/

SOCKET SOCKET_Create(int type)

{

SOCKET sock;

if(type == IPPROTO_UDP)

{

sock = socket(AF_INET, SOCK_DGRAM, 0);

}

else if(type == IPPROTO_TCP)

{

sock = socket(AF_INET, SOCK_STREAM, 0);

}

else //IPPROTO_IP {

sock = socket(AF_INET, SOCK_RAW, 0);

}

if(sock < 0)

{

log_write("error:failed to creat socket\n");

return FALSE;

}

else

{

return sock;

}

}

/***************************************************************************

* @function close the socket

* @param

* sockfd the socket to be closed

* @return success:the socket fd; fail:0

***************************************************************************/

UINT32 SOCKET_Close(SOCKET sockfd)

{

int n;

if((n = closesocket(sockfd)) < 0)

{

log_write("error:close failed\n");

return U_ERR;

}

#if (U_OS == OS_WIN32)

return (UINT32)WSACleanup();

#elif (U_OS == OS_LINUX)

return U_OK;

#endif

}

/***************************************************************************

* @function bind the socket

* @param

* stun_sock the socket to be bind

addr the socket address to be bind

* @return success:0; fail:~0

***************************************************************************/

UINT32 SOCKET_Bind(SOCKET stun_sock, SocketAddress* addr)

{

int n;

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr = addr-& gt;ip; //用inet_addr转化,不用(htonl) addrSrv.sin_port = htons(addr->port);

addrSrv.sin_family = addr->family;

if( (n=bind(stun_sock, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))) < 0 )

{

log_write("error:bind failed%d \n", WSAGetLastError());

return U_ERR;

}

else

{

return U_OK;

}

}

/***************************************************************************

* @function send data by UDP

* @param

* stun_sock The socket to send or receive data

* data Buffer used to store send or received data

* len The length of the buffer

* addr The destination address

* @return success:The data size; fail:~0

***************************************************************************/

UINT32 SOCKET_Sendto(SOCKET stun_sock, void *data,int len,SocketAddress* addr)

{

int n;

SOCKADDR_IN remoteaddr;

remoteaddr.sin_addr.S_un.S_addr = addr->ip;

remoteaddr.sin_port = htons(addr->port);

remoteaddr.sin_family = addr->family;

if( (n=sendto(stun_sock,data, len, 0, (SOCKADDR*)&remoteaddr,sizeof(SOCKADDR))) < 0 )

{

log_write("sendto error, %d\n", WSAGetLastError());

return U_ERR;

}

return (UINT32)n;

}

/***************************************************************************

* @function recv data by the UDP

* @param

* stun_sock The socket to send or receive data

* data Buffer used to store send or received data

* len The length of the buffer

* addrclient The source address

* @return success:the socket fd; fail:~0

***************************************************************************/

UINT32 SOCKET_Recvfrom(SOCKET stun_sock, void *data, int len, SocketAddress* addrclient)

{

int n;

int addrlen;

SOCKADDR_IN addr;

addrlen = sizeof(addr);

if( (n = recvfrom(stun_sock, data, len, 0, (SOCKADDR*)&addr, &addrlen)) < 0)

{

log_write("warning:recvfrom error%d\n", WSAGetLastError());

return U_ERR;

}

addrclient->ip = addr.sin_addr.S_un.S_addr;

addrclient->family = (unsigned char)addr.sin_family;

addrclient->port = ntohs(addr.sin_port);

return (UINT32)n;

}

/***************************************************************************

* @function send data by TCP

* @param

* stun_sock The socket to send or receive data

* data Buffer used to store send or received data

* len The length of the buffer

* @return success:The data size; fail:~0

***************************************************************************/

UINT32 SOCKET_Send(SOCKET stun_sock, void *data, int len)

{

int n;

if( (n=send(stun_sock,data, len, 0)) < 0 )

{

log_write("send error, %d\n", WSAGetLastError());

return U_ERR;

}

return (UINT32)n;

}

/***************************************************************************

* @function receive data from net by TCP

* @param

* stun_sock The socket to send or receive data

* data Buffer used to store send or received data

* len The length of the buffer

* @return success:the socket fd; fail:~0

***************************************************************************/

UINT32 SOCKET_Recv(SOCKET stun_sock, void * data, int len)

{

int n;

if( (n = recv(stun_sock, data, len, 0)) < 0 )

{

log_write("error:recv error\n");

return U_ERR;

}

return (UINT32)n;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值