我有两个不同的程序。两者都应该连接到另一个程序并向其发送一些文本,然后将相同的回显给它们。当我运行它们时,其中一个工作正常(我的回显服务器报告它收到的内容,并且程序对发回的内容做出反应),另一个不起作用(我在应该发送的语句之前和之后都有打印语句文本,都打印到屏幕但连接到同一个回显服务器,服务器从不接收数据,它仍然会验证连接但从不接收数据)。
工作代码是:
struct addrinfo *server;
struct addrinfo hints = {};
char ipAddr[16], portNum[6];
bool portNow = false;
int i = 0;
int j = 0;
for (i = 0; servList->monitor[i] != '\0'; ) {
/* successfully parses text in servList->monitor into two strings ipAddr and portNum
*/ }
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
getaddrinfo("localhost", portNum, &hints, &server);
servList->b_monitor = bufferevent_socket_new(eBase, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(servList->b_monitor, monitorRead, NULL, NULL, servList);
if(bufferevent_socket_connect(servList->b_monitor, server->ai_addr, server->ai_addrlen) != 0) { /* reports error */}
bufferevent_enable(servList->b_monitor, EV_READ|EV_WRITE);
bufferevent_write(servList->b_monitor, servList->name, sizeof(servList->name));
servList 是指向具有成员名称[30] 的结构的指针,servList 是指向回调函数monitorRead 使用的结构的链表的指针。我从这段代码中取出了错误处理,无论如何它运行时都不会触发。eBase 是传递给 this 所在函数的事件库。
不起作用的代码是:
int n;
char buffer [256];
struct event_base *base;
struct addrinfo *server;
struct addrinfo hints = {};
struct bufferevent *client;
char portNum[6] = "4044";
base = event_base_new();
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
getaddrinfo("localhost", portNum, &hints, &server);
client = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(client, clientRead, NULL, NULL, NULL);
if(bufferevent_socket_connect(client, serverTwo->ai_addr, serverTwo->ai_addrlen) != 0) {
/* reports error */
}
bufferevent_enable(client, EV_READ|EV_WRITE);
bzero(buffer,256);
fgets(buffer, 255, stdin);
printf("buffer to send: %s\n", buffer);
bufferevent_write(client, buffer, sizeof(buffer));
printf("after bufferevent write\n");
Buffer 的大小与 servList->name 不同,但都是 char [] 类型,client 与 servList->b_monitor 的类型相同。读入工作正常,因为它在调用 bufferevent_write() 之前打印到屏幕上。两种代码都不会从编译器生成任何警告或错误,第二个简单的似乎忽略了 bufferevent_write() 语句。
我一直在用细齿梳检查代码,并仔细研究 libevent 手册页等,但我无法弄清楚我在第二段代码中做了什么不同,所以它不起作用。我正在使用 Mac os X,如果这有所作为的话。如果我遗漏了任何重要信息,请告诉我,我将对其进行编辑。
编辑:端口号信息。在我的测试中,两个程序都使用相同的端口号