所以我试图用线程实现一个基本的客户端 - 服务器计算器。我能够实现cliente-server与套接字之间的通信,但是当我尝试向代码添加线程时,我感到很茫然。 这是我第一次使用这个论坛所以请抱歉,如果我正在提出一个愚蠢的问题,但我已经搜索了一些答案,我找不到任何有用的东西:( 我现在可以上传我的整个代码,我认为这就足够了:
在main中创建一个主题:
while(cliente_socket_fd = accept(socket_fd,(struct sockaddr*)&name_cliente,(socklen_t*)&cliente_name_len))
{
pthread_t thread;
new_sock = malloc(1);
*new_sock = cliente_socket_fd;
if(i <= nThreads) // nThreads is the maximum of threads permitted
{
if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
{
perror("Error");
return 1;
}
i++;
}
}
从创建线程中获取信息的函数:
void *connectionSocket(void *sockR)
{
int sock = *(int*)sockR;
int x;
char buffer[1024];
do{
x = strlen(buffer) + 1;
read(sock,buffer, x);
readSocket(sock, buffer);
}while(1 || strcmp(buffer,"end") != 0);
close(sock);
return 0;
}
服务器读取套接字功能:
int readSocket(int sock, const char* buffer)
{
//char buffer[1024];
//char message[1024] ;
int ssize;
ssize = strlen(buffer);
if(ssize == 0)
return 0;
char* message = (char*) malloc(ssize);
//memset(buffer, 0, sizeof buffer);
memset(message, 0, sizeof message);
strcat(message, buffer);
...
writeSocket(sock, message);
...
在套接字中写入的函数:
void writeSocket(int sock, const char* mensagem)
{
int ssize = strlen(message) + 1;
write(sock, &ssize, sizeof(ssize));
write(sock, message, ssize);
}
再次对不起,如果我是一个菜鸟或要求太多,但非常感谢任何帮助。感谢。
答案 0 :(得分:0)
:connectionSocket()
这一行
x = strlen(buffer) + 1;
是垃圾,因为strlen()
在找到NUL字节时会停止。
但是,buffer
尚未设置为已知条件,因此缓冲区中可能存在也可能不存在NUL字节。 I.E.未定义的行为。
发生错误时accept()
函数返回-1,但是发布的代码会盲目地继续进入循环体
建议写下类似于:
的行while( 1 )
{
cliente_socket_fd = accept(socket_fd,(struct sockaddr*)&name_cliente, (socklen_t*)&cliente_name_len) );
if( -1 == cliente_socket_fd )
{
perror( "accept failed" );
break; // exit loop
}
// implied else, accept successful
然后,为了能够访问这些线程,稍后,这一行:
if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
应该设置一个'唯一''线程'而不是唯一的'线程'建议:
pthread_t thread[ nThreads ] = {0};
if(pthread_create(&thread[i], NULL, connectionSocket, (void*)new_sock) < 0)
然后,套接字(实际上)是一个整数,取决于底层硬件架构是4或8字节所以这一行:
new_sock = malloc(1);
没有分配足够的字节,应该是:
new_sock = malloc( sizeof( int ) );
if( !new_sock )
{ // then, malloc failed
perror( "malloc failed" );
break; // exit loop
}
// implied else, malloc successful
*new_sock = cliente_socket_fd;
这一行:
}while(1 || strcmp(buffer,"end") != 0);
永远不会退出循环。建议:
}while( strcmp(buffer,"end") != 0 );
这一行:
read(sock,buffer, x);
将尝试读取一些随机数字节,因为“x”中的值无效。推荐;
read(sock,buffer, sizeof( buffer ));
以上是发布代码中最明显的问题。如果您发布了一个干净的编译,简短的示例,可以运行并仍然显示问题,我可以帮助您更多。