两个非常相似的c代码,一个工作一个不起作用,为什么?

时间:2013-04-30 18:24:28

标签: c network-programming libevent

我有两个不同的程序。两者都应连接到另一个程序并向其发送一些文本,然后将它们回显给它们。当我运行它们时,其中一个工作正常(我的echo服务器报告收到的内容,程序对发回的内容作出反应),另一个不起作用(我在发送语句之前和之后有打印语句文本,既打印到屏幕但连接到同一个echo服务器,服务器从不接收数据,它仍将验证连接但从未接收数据)。

工作代码是:

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是传递给它所在的函数的事件库。

不起作用的代码是:

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

缓冲区大小与servList->名称不同,但两者都是char []类型,client类型与servList-> b_monitor相同。读入正在工作,因为它在调用bufferevent_write()之前打印到屏幕。这两个代码都没有从编译器生成任何警告或错误,第二个简单似乎忽略了bufferevent_write()语句。

我一直用精细的牙齿梳理代码,仔细研究一下这个代码,但是我无法弄清楚我在第二段代码中做了什么不同以致它不起作用。我正在使用Mac OS X,如果这有所作为。如果我遗漏任何重要信息,请告诉我,我将在其中进行编辑。

编辑:端口号信息。在我的测试中,两个程序都使用相同的端口号

0 个答案:

没有答案