[急啊]socket问题,哪位朋友帮帮忙。在线等候,一有结果,立即结贴

kitcaii 2008-08-08 05:23:24
实现一个socket简单通讯
编译出现了2个错误
e:\myC++\1.1\socket.cpp(30): error C2065: “BACKLOG” : 未声明的标识符
e:\myC++\1.1\socket.cpp(96): error C2065: “CLOSE_TRY_TIMES” : 未声明的标识符

请问是没有连接ws2_32.dll文件的原因吗,在vs.net2003中如何连接?
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
IanFang 2008-08-08
  • 打赏
  • 举报
回复
自己定义个,例如:
#define BACKLOG 5
#define CLOSE_TRY_TIMES 10
kitcaii 2008-08-08
  • 打赏
  • 举报
回复
//--------socket.h-----------

#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;
};

//--------socket.cpp-----------

#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");
}
}


仍然是刚才2个错误啊
e:\myC++\1.1\socket.cpp(30): error C2065: “BACKLOG” : 未声明的标识符
e:\myC++\1.1\socket.cpp(96): error C2065: “CLOSE_TRY_TIMES” : 未声明的标识符
wfwsm 2008-08-08
  • 打赏
  • 举报
回复
错了 改这个
#pragma comment(lib,"Ws2_32.lib")
过去的我 2008-08-08
  • 打赏
  • 举报
回复
socket肯定要连ws2_32.lib, 在编译选项的link 栏里
wfwsm 2008-08-08
  • 打赏
  • 举报
回复
#include<winsock2.h>
#param comment(lib, "Ws2_32.lib")
脚跟着地 2008-08-08
  • 打赏
  • 举报
回复
包含了winsock.h没有?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧