周五去一个公司打了个酱油,面试官问我:你封装过socket没?
言下之意是问我实际写过底层代码没,我悻悻地说写过点。
PS:说实话木有封装过,今天无聊就来封装下。
话说写了这么久C++,底层用c来写还是灰常爽的,C++把它包起来很好看而且好用。
嗯嗯,言归正传,创建了MyTCPSocket:
问题记录1:一旦来了新的链接,就创建一个work线程来处理,但是遇到了小问题:
#pragma once #include <winsock.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") static DWORD WINAPI WorkerFun(LPVOID aData); class MyTCPSocket { public: MyTCPSocket(void); ~MyTCPSocket(void); bool Init(); bool UnInit(); bool CreateSocket(); bool Bind(unsigned aPost,const char* aAdress); bool Listen(int aBacklog=5); bool Connect(unsigned aPost,const char* aAdress); bool Send(const char* aBuf); bool Recv(); void Accept(); private: SOCKET m_Socket; SOCKET m_ClientSocket; sockaddr_in m_SockClientaddrIn ; }; #include "MyTCPSocket.h" MyTCPSocket::MyTCPSocket(void) :m_Socket(INVALID_SOCKET) { } MyTCPSocket::~MyTCPSocket(void) { } bool MyTCPSocket::Init() { int iResult; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d ", iResult); return false; } else { printf("WSAStartup succeeded! "); return true; } } bool MyTCPSocket::CreateSocket() { m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == m_Socket) { printf("INVALID_SOCKET "); return false; } printf("Create Socket(%d) successully. ",m_Socket); BOOL reuseaddr=TRUE; setsockopt(m_Socket,SOL_SOCKET,SO_REUSEADDR,(const char*)&reuseaddr,sizeof(reuseaddr)); return true; } bool MyTCPSocket::Bind(unsigned aPost,const char* aAdress) { struct sockaddr_in server_addr; // server address information server_addr.sin_family = AF_INET; // host byte order server_addr.sin_port = htons(aPost); // short, network byte order server_addr.sin_addr.s_addr = inet_addr(aAdress); // automatically fill with my IP memset(server_addr.sin_zero, '