Простой Linux C / S сокет с pthread - PullRequest
2 голосов
/ 16 февраля 2012

, поэтому я хотел бы подключить несколько клиентов к серверу с сокетом под ядро ​​Linux 2.6.x.когда клиент подключен, сервер отправит приветственное сообщение клиенту, таким образом, чтобы отобразить на стандартном выводе или что-то еще. поэтому, когда соединение установлено, один поток передается функции, которая может доставить приветственное сообщениеочень client.when я использовал другой процессор для выполнения этой работы, это нормально. Однако, когда я переключился на pthread пути, клиенты не могли получить ничего от сервера. В этот момент я проверил netstat, соединение все еще былона .so приходит мой код:

client.c

// to make long story short,
// i'll just omit most of declarations and stuff that is irrelavent to the problem
#define PORT 12345
#define IP_ADDR "127.0.0.1"
void *process_to_server(int socket);
int main(){
   // i'll skip building socket for your convinence
   process_to_server(socket_server);

}
void *process_to_server(int socket){
   ssize_t size=0;
   char buffer[1024];
   size=read(socket,buffer,1024);
   write(1,buffer,size+1);// output the welcome message to the client's standard output
}

server.c

#define PORT 12345
void *process_to_client(int socket);
int main(){
   // same spirit as above
   while(1){
     int addrlen=sizeof(struct sockaddr);
     socket_client = accept(socket_server,(struct sockaddr*)&client_addr,&addrlen);
     if(socket_client<0) continue;

     pthread_t pth;
     close(socket_server);
     pthread_create(&pth,NULL,(void*)&process_to_client,&socket_client);
     }
}

void *process_to_client(int socket){
    char buffer[1024];
    sprintf(buffer,"Hello There\n");
    write(socket,buffer,1024);
}

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Аргументом вашей функции потока является указатель, но вы используете его непосредственно как целое число.Измените свою функцию потока следующим образом:

void *process_to_client(void *socket_pointer){
    int socket = *(int *) socket_pointer;
    char buffer[1024];
    sprintf(buffer,"Hello There\n");
    write(socket,buffer,1024);
}
1 голос
/ 16 февраля 2012

Вы переводите &socket_client в рабочий поток, но используете параметр функции потока, как если бы он был socket_client

Вы можете сделать это:

int main() {
/*...*/
pthread_create(&pth,NULL,(void*)&process_to_client,(void*)socket_client);
/*...*/
}

void *process_to_client(void* pvsocket) {
int socket = (int) pvsocket;
/* same as before */
}

Кроме того, закрытие сокета прослушивания сохранит принятое соединение открытым. Вы сможете продолжить связь с подключенным клиентом, но дальнейшее входящее соединение не будет принято. Рабочий поток должен закрыться socket_client, когда связь будет установлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...