socket簡單多線程方式

fpwb4193 8年前發布 | 5K 次閱讀 C/C++


#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
void* socketProcess(void* socket_desc );

int main(int argc, char const* argv[])
{
    int sock_desc,c,recv_len;
    int *new_sock;
    char client_message[512];
    struct sockaddr_in server,client;
    sock_desc=socket(AF_INET,SOCK_STREAM,0);
    if(sock_desc<0){
        puts("錯誤");
        return 1;
    }
    server.sin_addr.s_addr=INADDR_ANY;
    server.sin_port=htons(8888);
    server.sin_family=AF_INET;
    if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<0){
        puts("綁定錯誤");
    }
    puts("綁定完成");


    listen(sock_desc,5);
    puts("正在監聽等待連接");


    while(1){
        new_sock=(int*)malloc(sizeof(int));
        *new_sock=accept(sock_desc,(struct sockaddr*)&client,(socklen_t* )&c);
        pthread_t thread_id;
        puts("接受請求");
        if(*new_sock!=-1){
            char ipv4addr[100];
             char addr_buf[INET_ADDRSTRLEN];
             socklen_t len;
             if(getsockname(*new_sock,(struct sockaddr*)&client,&len)==-1)
             {
                 perror("gesockname err");
             }
             printf("ip:%d\n",ntohs(client.sin_port));
            if(pthread_create(&thread_id,0,&socketProcess,(void*)new_sock)<0){//創建一個線程
                perror("創建線程失敗");
                return 1;
            }
            pthread_detach(thread_id);//線程分離
        }
        puts("新客戶連接");

    }
    puts("連接成功");
    return 0;
}
void* socketProcess(void* socket_desc ){
 int *csock = (int*)socket_desc;


     char buffer[1024];
     int buffer_len = 1024;
     int bytecount;

     while(1){
         memset(buffer, 0, buffer_len);
         if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
             fprintf(stderr, "接收數據錯誤,錯誤代碼: %d\n", errno);
             close(*csock);
             return(0);
         }
         printf("接收到字節數 %d\n接收字符串 \"%s\"\n", bytecount, buffer);
         strcat(buffer, " SERVER ECHO\n");

         if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){
             fprintf(stderr, "錯誤發送數據 %d\n", errno);
             close(*csock);
             return(0);
         }

         printf("發送字節數 %d\n", bytecount);
     }
     return 0;
}


 本文由用戶 fpwb4193 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!