这里整理一些C++网络编程常用函数的封装,方便使用,以后会慢慢添加完善
* 将Socket设置为非阻塞
#include <fcntl.h>
int setNonblock(int fd)
{
int flag;
if ((flag = fcntl(fd, F_GETFL, 0)) < 0 || fcntl(fd, F_SETFL, flag | O_NONBLOCK) < 0) {
return -1;
}
return 0;
}
* 获取指定网卡的IP地址
#include <net/if.h>
#include <sys/ioctl.h>
int getIpOfNic(const string strNic, string & strIp)
{
int fd;
struct ifreq ifr;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
return -1;
}
strcpy(ifr.ifr_name, strNic.c_str());
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
close(fd);
return -2;
}
strIp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr);
return 0;
}
* 创建一个udpSocket句柄(tcpSocket类似)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int createUdpSocket(const string strIp, const uint32_t uPort, bool bBlock = false)
{
int fd;
struct sockaddr_in sSvrAddr;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
return -1;
}
if (bBlock) {
if (setNonblock(fd) < 0) {
close(fd);
return -2;
}
}
memset(&sSvrAddr, 0, sizeof(sSvrAddr));
sSvrAddr.sin_family = AF_INET;
sSvrAddr.sin_addr.s_addr = inet_addr(strIp.c_str());
sSvrAddr.sin_port = htons(uPort);
if (bind(fd, (struct sockaddr *)&sSvrAddr, sizeof(sSvrAddr)) <0) {
close(fd);
return -3;
}
return fd;
}