64,654
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using std::string;
#include <string.h>
#include "errno.h"
#include "winsock2.h"
#pragma comment(lib,"Ws2_32.lib")
class Socket {
public:
bool setup();
void close();
bool connect(string host, int port);
bool listen();
int accept();
int recv(char *buf, int len);
int recv(int new_fd, char *buf, int len);
int send(const char *msg, int len);
int send(int new_fd, const char *msg, int len);
private:
int _fd;
};
#include "socket.h"
bool Socket::setup() {
WSADATA wsd;
_fd = WSAStartup(MAKEWORD(2,2), &wsd);
if(_fd) {
return false;
}
_fd = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (_fd == -1) {
return false;
}
return true;
}
bool Socket::listen() {
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(52309);
my_addr.sin_addr.s_addr = INADDR_ANY;
if(::bind(_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR) {
return false;
}
if(::listen(_fd,BACKLOG) == SOCKET_ERROR) {
return false;
}
return true;
}
int Socket::accept()
{
int new_fd;
struct sockaddr_in their_addr;
int sin_size = sizeof(their_addr);
printf("accepting... \n");
new_fd = ::accept(_fd, (struct sockaddr *)&their_addr, &sin_size);
return new_fd == SOCKET_ERROR ? -1:new_fd;
}
bool Socket::connect(string host, int port){
struct hostent *_h = gethostbyname(host.c_str());
if (_h == 0) {
return false;
}
struct in_addr *_addr = (struct in_addr *)_h->h_addr;
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr = *_addr;
sin.sin_port = htons(port);
if (::connect(_fd, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) {
return false;
}
return true;
}
int Socket::recv(int new_fd, char *buf, int len)
{
int nb = ::recv(new_fd, buf, len, 0);
if (nb == -1) {
printf("Error! recv.\n");
}
return nb;
}
int Socket::recv(char *buf, int len) {
return recv(_fd, buf, len);
}
int Socket::send(const char *msg, int len) {
return send(_fd, msg, len);
}
int Socket::send(int new_fd, const char *msg, int len)
{
int nb = ::send(new_fd, msg, len, 0);
if (nb == -1) {
printf("Error! send.\n");
}
return nb;
}
void Socket::close() {
int trytimes = 0;
while(::closesocket(_fd) && trytimes < CLOSE_TRY_TIMES)
trytimes++;
if(trytimes == 10) {
printf("Cannot close socket!\n");
}
}