这里整理一些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; }