【发布时间】:2016-03-10 11:08:35
【问题描述】:
我正在为一个作业编写一个小型 UDS 服务器,并且觉得我的代码大部分都在那里,但是当我实际尝试运行它时,我绝对没有得到任何结果。
代码由一个 shell 脚本测试,该脚本向我的代码的主函数发送几个不同的测试调用。传递给 main 的唯一内容是 log 文件名和 UDS path,然后不同的客户端连接到服务器,这应该只是导致特定的输出日志来检查服务器代码的正确性。
我的主要功能在这里:
int main( int argc, char * argv[] )
{
if ( argc != 3 )
return usage( argv[0] );
log_fd = fopen(argv[1], "a");
// create a server socket
// domain (i.e., family) is AF_UNIX
// type is SOCK_STREAM
int listenfd = socket(AF_UNIX, SOCK_STREAM, 0);
socklen_t clientLength = sizeof(struct sockaddr_un);
struct sockaddr_un clientAddr;
clientAddr.sa_family = AF_UNIX;
strcpy(clientAddr.sun_path, argv[2]);
pthread_t tid;
// unlink the UDS path)
unlink(argv[2]);
// bind the server socket
bind(listenfd, (SA *)&clientAddr, clientLength);
// listen
listen(listenfd, 1024);
// loop to wait for connections;
// as each connection is accepted,
// launch a new thread that calls
// recv_log_msgs(), which receives
// messages and writes them to the log file
while(1){
printf( "Waiting for a connection on UDS path %s...\n", argv[2] );
int * clientfdp = malloc(sizeof(int));
*clientfdp = accept(listenfd, (SA *) &clientAddr, &clientLength);
pthread_create(&tid, NULL, recv_log_msgs, clientfdp);
}
// when the loop ends, close the listening socket
close(listenfd);
// close the log file
fclose(log_fd);
return 0;
}
用法是myloggerd <log-file-name> <UDS path>。
这个主函数监听任何客户端连接,当一个被接受时,它在线程例程函数中创建一个新线程,称为recv_log_msgs。我的代码在这里:
void * recv_log_msgs( void * arg ) //Thread Routine
{
// loops to receive messages from a client;
// when the connection is closed by the client,
// close the socket
int clientfd = *((int *)arg);
char buffer[1500];
memset(buffer, 0, 1500);
int currentPos = 0;
int bytesRec;
int recvng = 1;
while(recvng){
bytesRec = recv(clientfd, buffer, 1500-currentPos, 0);
currentPos += bytesRec;
if(buffer[currentPos - 1] == '\n')
recvng = 0;
}
fprintf(log_fd, "LOGGER %d %s", clientfd, buffer);
close(clientfd);
return NULL;
}
因此,每次线程进入该函数时,都会将数据写入日志文件。如果日志文件结果正确,那么我得到 100%。如果没有,那我就失败了。
截至目前,当我测试我的解决方案时,什么都没有发生。
我得到一个打印的无限循环,上面写着Waiting for connection on the UDS path...,它位于main 末尾的while 内。这不应该继续循环一个我已经调用accept 并创建线程,直到该线程退出?
【问题讨论】:
-
` if(buffer[currentPos - 1] == '\n')` 不能工作。是否找到换行符取决于获得的块大小。
-
什么意思?该行取自我的教科书编辑:但这与我的直接关注无关,因为我的代码甚至没有达到该功能。
-
请注意
recv可以在第一次迭代时返回0和-1。这意味着buffer[currentPos - 1]上的未定义行为 -
你必须调用pthread_join来等待线程终止。
-
这正是您应该检查错误代码的原因 - 接受不阻止那里的错误提示
标签: c multithreading sockets